MS Visual C++通过单击按钮启动函数而不阻塞对话框



我在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

相关内容

  • 没有找到相关文章

最新更新