我在MS Visual Studio 2013上创建了一个基于对话框的MFC应用程序。在对话框中,我添加了ActiveX元素和其他一些列表元素来显示文本输出。其中一个ID为IDC_BUTTONLAUNCH
的按钮调用类似的函数
void CpiezcamDlg::OnBnClickedButtonlaunch()
{
SweepAndImage();
}
函数SweepAndImage()
是类CpiezcamDlg
的一个成员,价格稍贵(大约需要10秒)。该函数还调用对列表元素的更新。SweepAndImage()
内部还有一个Sleep
函数。结果是,在调用该函数的过程中,整个对话框被"阻塞",并且没有反应(这是有道理的)。本周我刚开始学习MFC,所以我的知识相当有限。我试着做
void CpiezcamDlg::OnBnClickedButtonlaunch()
{
#pragma omp parallel
{
#pragma omp single nowait
SweepAndImage();
}
}
将函数"分叉"到另一个线程中。由于在omp
杂注的末尾有一个隐含的屏障,所以这不起作用。我想我需要一些在应用程序后台运行的排序事件处理程序,看看这个按钮是否被点击了。感谢任何形式的帮助或链接。如果需要更多信息,我会添加它。
OpenMP使用fork和线程来完成工作。在这里它不会真的实现你的愿望。
MFC的GUI正在主线程上运行。SweepAndImage将在一个单独的线程中运行,但是OnBnClickedButtonlaunch将阻止等待SweepAndImage从工作中返回,然后它将继续。由于主线程已被阻止,对GUI的更新也将停止。Windows/MFC有一个隐藏的窗口消息泵,它被抽象掉了。该泵依赖于事件处理程序(即按钮按下方法)不会阻塞太长时间,以便泵可以继续处理队列中的下一个事件。
由于您使用的是MFC,因此MFC确实支持多线程。我建议从MSDN的这篇文章开始
您可以做的是在按钮处理程序中创建一个新线程(请参阅上面的文章),该线程会产生一些工作。这将允许主线程立即继续,并在其泵中继续处理窗口事件。
要完成:定义
UINT SweepAndImage(LPVOID pParam)
称之为
AfxBeginThread(SweepAndImage, NULL);
使用而不是return 0
AfxEndThread(0, TRUE); /* or (1, ...) for return 1 */
退出SweepAndImage