你在线程里做了什么!!!!!去操作进度条了!!!不是不可以,你假死的原因,是没把工作量大的提取图片的工作放到线程里,你应该摆while里的东西,放到线程里去做!!你的后台就是线程函数,在按钮中启动线程。
线程函数里,先计算视频总帧数,也就是提取图片的总数,设置初始化进度条。
然后进入循环处理提取图片的工作。每次提取图片完,都要修改下进度条。
你在线程提取图片循环里,最好都sleep下,防假死,线程中,不要操作进度条,方法是发消息,让主线程(界面线程)处理,或者调用一个接口函数,处理进度条。

解决方案 »

  1.   

    你的流程有点问题。
    1、void CVideoToPictureDlg::OnBnClickedOk()你这个函数里面正确的处理应该只是一些参数的初始化,例如视频文件的路径赋值,视频的总帧数赋值等,这些参数初始化完成后紧接着开启一个线程A。
    2、线程A来执行你保存单个帧的任务,同时向主窗体发送自定义消息,自定义消息的内容就是当前保存帧的进度值,在自定义消息处理函数中来设置进度条。
    3、在void CVideoToPictureDlg::OnBnClickedOk()中初始化的参数,你要保证他们的生命周期,因为在线程A中要使用到。
      

  2.   


    谢谢你,我根据你说的,已经改好了,但是还有几个小问题想搞明白
    先是“AfxBeginThread(ThreadSpeed, &m_ctrlProgress);//此处创建新线程”这一句放在while循环里,会不会导致创建多个线程? 还是因为线程函数名是一样的,编译器自动识别出来了,只创建一个?
    其次是“你在线程提取图片循环里,最好都sleep下,防假死,”sleep会不会导致每次循环都变慢啊?  而且sleep为什么能防假死我也不太明白十分感谢~
      

  3.   

    AfxBeginThread不要再循环里面做,这个只是开启一个线程,线程函数里面做循环,做耗时费力的事
    sleep是要线程停歇片刻,把时间片给cpu,可以让主线程得到响应,就不会假死了,现在多核cpu功能强大,基本不会出现的