我在 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();
}
}
将函数“fork”到另一个线程中。由于在 omp
杂注末尾有一个隐式屏障,因此这不起作用。我想我需要一些在我的应用程序后台运行的排序事件处理程序,看看是否单击了该按钮。感谢任何类型的帮助或链接。如果需要更多信息,我会添加。
最佳答案
OpenMP 使用 fork 和 thread 来完成工作。它不会真正按照您的意愿行事。
MFC 的 GUI 运行在主线程上。 SweepAndImage 将在单独的线程中运行,但 OnBnClickedButtonlaunch 将阻止等待 SweepAndImage 从工作中返回,然后它将继续。因为主线程已被阻止,对 GUI 的更新也将停止。 Windows/MFC 有一个隐藏的窗口消息泵,它被抽象掉了。该泵依赖于事件处理程序(即您的按钮按下方法)不会阻塞太久,以便泵可以继续处理队列中的下一个事件。
由于您使用的是 MFC,因此 MFC 确实支持多线程。我建议从这个 MSDN article 开始
您可以做的是在您的按钮处理程序中创建一个新线程(请参阅上面的文章)以产生一些工作。这将允许主线程立即继续并继续在其泵中处理窗口事件。
关于c++ - MS Visual C++ 通过单击按钮启动功能而不阻塞对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25702791/