关于mfc多线程进度条的问题

日光倾城亦微凉 日光倾城亦微凉 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
这是我暑假的大作业,具体实现的是把视频中的每一帧提取成图片保存下来
做完之后,我想为它加上一个进度条,如图所示

可是运行之后,程序窗口都会显示“未响应”,查了资料才知道要用到多线程
关键部分代码如下:
在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更新,导致程序看起来无响应。

Bloodhawk

在MFC应用程序中实现状态栏进度条显示

本文还有配套的精品资源,点击获取 简介:介绍如何在MFC应用中创建并集成进度条到状态栏中。涵盖创建进度条类、在资源中添加进度条控件、初始化进度条、更新进度条以及关闭进度条的详细步骤。实例展示了如何将这些步骤整合到多线程环境以实时显示计算进程。 1. MFC状态栏简介 1.1 MFC状态栏概述 在Windows应用程序中,状态栏(StatusBar)是界...

丰雅

实现MFC多线程应用程序中的进度条显示

在现代软件应用中,多线程是提高程序效率与响应能力的重要技术手段。MFC(Microsoft Foundation Classes)作为一套封装了大量Windows API的C++类库,为开发者提供了便捷的多线程开发支持。通过MFC进行多线程编程,可以实现复杂的应用逻辑,特别是在涉及大量数据处理和实时交互的应用中显得尤为重要。本章旨在为读者提供一个关于MFC多线程开发的综述,帮助理解其核心概念与实践价值。

高杉峻

多线程使用进度条+(实例+C++代码)MFC系列

**同步问题**:在多线程环境中,直接修改UI(如进度条)可能会引发数据竞争和同步问题。

liao5189

基于对话框的多线程进度条更新示例

本示例“基于对话框的多线程进度条更新”展示了如何在MFC环境中利用多线程技术来更新对话框中的进度条控件,以实时反映后台任务的执行状态。

terry006
评论 8
收藏 已收藏
分享
返回顶部