c++ - MS Visual C++ 通过单击按钮启动功能而不阻塞对话框

标签 c++ button mfc event-handling

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

相关文章:

c++ - 如何从 CWinThread 访问 AfxGetMainWnd()?

c++ - 为什么这个键盘拦截内核扩展不起作用?

c++ - 使用 CMake 创建 Qt qml C++ 插件

C++ 从函数返回指针。值(value)丢失

c++ - CGAL - boost 创建无向图

twitter-bootstrap - 设置 Bootstrap 复选框按钮的初始值

css - 按下后更改按钮样式 - CSS

单击按钮时不会调用 Android OnClickListener

c++ - C++/MFC 中枚举网络共享目录

windows - 需要 ActiveX 控件才能将 Excel 嵌入到对话框中