你在线程里做了什么!!!!!去操作进度条了!!!不是不可以,你假死的原因,是没把工作量大的提取图片的工作放到线程里,你应该摆while里的东西,放到线程里去做!!你的后台就是线程函数,在按钮中启动线程。
线程函数里,先计算视频总帧数,也就是提取图片的总数,设置初始化进度条。
然后进入循环处理提取图片的工作。每次提取图片完,都要修改下进度条。
你在线程提取图片循环里,最好都sleep下,防假死,线程中,不要操作进度条,方法是发消息,让主线程(界面线程)处理,或者调用一个接口函数,处理进度条。
线程函数里,先计算视频总帧数,也就是提取图片的总数,设置初始化进度条。
然后进入循环处理提取图片的工作。每次提取图片完,都要修改下进度条。
你在线程提取图片循环里,最好都sleep下,防假死,线程中,不要操作进度条,方法是发消息,让主线程(界面线程)处理,或者调用一个接口函数,处理进度条。
解决方案 »
- 双缓冲
- 请教API函数ShellExecuteA(Long hwindow, String lpOperation, String lpFile, String lpParameters, String lpDirectory, Long nShowCmd
- GDI+高手请进,显示内存中图片的问题
- vc++使用的一个小问题
- access编的数据表里有ole对象格式的,在vc中找不到对应的变量支持
- 两个问题,请帮帮小妹!
- 请教高手:DLL文件自删除的问题
- 已知桌面上一条直线上有A,B,C3点,C,B两点坐标及B点到A点的距离已知,如何得到A点坐标?
- 生成类的实例
- 如何在vc中使用vb中的FileSystemObject?
- gdi+使用错误
- 主对话框中计算的数据在子对话框中显示问题
1、void CVideoToPictureDlg::OnBnClickedOk()你这个函数里面正确的处理应该只是一些参数的初始化,例如视频文件的路径赋值,视频的总帧数赋值等,这些参数初始化完成后紧接着开启一个线程A。
2、线程A来执行你保存单个帧的任务,同时向主窗体发送自定义消息,自定义消息的内容就是当前保存帧的进度值,在自定义消息处理函数中来设置进度条。
3、在void CVideoToPictureDlg::OnBnClickedOk()中初始化的参数,你要保证他们的生命周期,因为在线程A中要使用到。
谢谢你,我根据你说的,已经改好了,但是还有几个小问题想搞明白
先是“AfxBeginThread(ThreadSpeed, &m_ctrlProgress);//此处创建新线程”这一句放在while循环里,会不会导致创建多个线程? 还是因为线程函数名是一样的,编译器自动识别出来了,只创建一个?
其次是“你在线程提取图片循环里,最好都sleep下,防假死,”sleep会不会导致每次循环都变慢啊? 而且sleep为什么能防假死我也不太明白十分感谢~
sleep是要线程停歇片刻,把时间片给cpu,可以让主线程得到响应,就不会假死了,现在多核cpu功能强大,基本不会出现的