我已经在MS Visual Studio 2013上创建了一个基于对话框的MFC应用程序。向该对话框中,添加了ActiveX元素和一些其他列表元素以显示文本输出。 ID为IDC_BUTTONLAUNCH的按钮之一调用如下函数

void CpiezcamDlg::OnBnClickedButtonlaunch()
{
  SweepAndImage();
}

函数SweepAndImage(),它是CpiezcamDlg类的成员,并且价格更高(大约需要10秒)。该函数还调用对列表元素的更新。 Sleep内还有一个SweepAndImage()函数。结果是,在调用此函数期间,整个对话框被“阻止”并且不响应(这很有意义)。我本周刚开始使用MFC,所以我的知识非常有限。我试着做
void CpiezcamDlg::OnBnClickedButtonlaunch()
{
#pragma omp parallel
  {
  #pragma omp single nowait
      SweepAndImage();
  }
}

将功能“ fork ”到另一个线程。由于omp编译指示的末尾有一个隐式屏障,因此不起作用。我想我需要一个在我的应用程序后台运行的排序事件处理程序,并查看是否单击了该按钮。任何帮助或链接都将受到赞赏。如果需要更多信息,我将其添加。

最佳答案

OpenMP使用 fork 和线程来工作。它不会真正满足您的期望。

MFC的GUI在主线程上运行。 SweepAndImage将在单独的线程中运行,但是OnBnClickedButtonlaunch将阻止等待SweepAndImage从工作中返回,然后继续进行。由于主线程已被阻止,因此对GUI的更新也将停止。 Windows / MFC具有一个隐藏的窗口消息泵,该消息泵已被抽象化。该泵依赖事件处理程序(即您的按钮按下方法)的阻塞时间不会太长,因此该泵可以继续处理队列中的下一个事件。

由于您使用的是MFC,因此MFC确实支持多线程。我建议从此MSDN article开始

您可以做的是在按钮处理程序中创建一个新线程(请参阅上面的文章),以产生一些工作。这将允许主线程立即继续并继续处理其泵中的Windows事件。

关于c++ - MS Visual C++通过单击按钮而不阻止对话框来启动功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25702791/

10-11 16:51
查看更多