关于mfc多线程进度条的问题
这是我暑假的大作业,具体实现的是把视频中的每一帧提取成图片保存下来
做完之后,我想为它加上一个进度条,如图所示
可是运行之后,程序窗口都会显示“未响应”,查了资料才知道要用到多线程
关键部分代码如下:
在VideoToPictureDlg.h中:
在VideoToPictureDlg.cpp中:
但是代码改成以上内容以后窗口仍然会未响应(其实后台在提取图片),调试时也进不到线程函数内部。
可能是自己还不太理解多线程。
希望大神们能帮帮我,谢谢!
做完之后,我想为它加上一个进度条,如图所示

可是运行之后,程序窗口都会显示“未响应”,查了资料才知道要用到多线程
关键部分代码如下:
在VideoToPictureDlg.h中:
protected:
CWinThread* pThread;
UINT ThreadSpeed(LPVOID lpParameter);//线程函数的声明 此行在类外
在VideoToPictureDlg.cpp中:
//下面是BOOL CVideoToPictureDlg::OnInitDialog()函数中关于初始化的代码:
m_ctrlProgress.SetRange(0,100);
//设置进度条的每一步的增量
m_ctrlProgress.SetStep(1);
//设置进度条的当前位置
m_ctrlProgress.SetPos(1);
m_ctrlProgress.SendMessage(PBM_SETBKCOLOR, 0, RGB(255, 255, 255));//背景色
m_ctrlProgress.SendMessage(PBM_SETBARCOLOR, 0, RGB(0, 255, 0));//前景色
waitKey();
return TRUE;
//下面是点击开始键的响应函数:
void CVideoToPictureDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
if(infilename.IsEmpty())
{
MessageBox("请选择视频文件", "提示",MB_OK);
return;
}
else if(outfilename.IsEmpty())
{
MessageBox("请选择输出文件夹", "提示",MB_OK);
return;
}
CvCapture* capture = cvCreateFileCapture((LPSTR)(LPCTSTR)infilename);
IplImage* frame;
int i = 0;
char image_name[20];
CString Out;
//pThread = AfxBeginThread(ThreadSpeed, &m_ctrlProgress);
int numFrames = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_COUNT);
while(1)
{
frame = cvQueryFrame(capture);
if(!frame) break ;
sprintf_s(image_name, "%s%d%s", "image", ++i, ".jpg");//保存的图片名
CString str3;
str3.Format("%s",image_name);
CString str2 = _T("\\");
Out = outfilename + str2 + str3;
cvSaveImage((LPSTR)(LPCTSTR)Out, frame); //保存一帧图片
int jindu = (i * 100)/numFrames;
percent = jindu;
pThread = AfxBeginThread(ThreadSpeed, &m_ctrlProgress);//此处创建新线程
}
MessageBox("已完成提取", "提示",MB_OK);
cvReleaseCapture(&capture);
}
//下面是线程函数
UINT ThreadSpeed(LPVOID lpParameter)
{
CProgressCtrl *Speed = (CProgressCtrl*)lpParameter;
Speed->SetPos((percent));
Sleep(10);
return 0;
}
但是代码改成以上内容以后窗口仍然会未响应(其实后台在提取图片),调试时也进不到线程函数内部。
可能是自己还不太理解多线程。
希望大神们能帮帮我,谢谢!
...全文
相关推荐
多线程mfc进度条
本示例项目“多线程MFC进度条”旨在解决一个常见的UI问题:当执行耗时任务时,如何保持用户界面(UI)的响应性。在单线程应用程序中,长时间运行的任务会阻塞UI更新,导致程序看起来无响应。
在MFC应用程序中实现状态栏进度条显示
本文还有配套的精品资源,点击获取 简介:介绍如何在MFC应用中创建并集成进度条到状态栏中。涵盖创建进度条类、在资源中添加进度条控件、初始化进度条、更新进度条以及关闭进度条的详细步骤。实例展示了如何将这些步骤整合到多线程环境以实时显示计算进程。 1. MFC状态栏简介 1.1 MFC状态栏概述 在Windows应用程序中,状态栏(StatusBar)是界...
实现MFC多线程应用程序中的进度条显示
在现代软件应用中,多线程是提高程序效率与响应能力的重要技术手段。MFC(Microsoft Foundation Classes)作为一套封装了大量Windows API的C++类库,为开发者提供了便捷的多线程开发支持。通过MFC进行多线程编程,可以实现复杂的应用逻辑,特别是在涉及大量数据处理和实时交互的应用中显得尤为重要。本章旨在为读者提供一个关于MFC多线程开发的综述,帮助理解其核心概念与实践价值。
多线程使用进度条+(实例+C++代码)MFC系列
**同步问题**:在多线程环境中,直接修改UI(如进度条)可能会引发数据竞争和同步问题。
基于对话框的多线程进度条更新示例
本示例“基于对话框的多线程进度条更新”展示了如何在MFC环境中利用多线程技术来更新对话框中的进度条控件,以实时反映后台任务的执行状态。


进程/线程/DLL
