在 OpenMP 循环内调用 QApplication::processEvents()?

发布于 2024-10-14 20:51:16 字数 835 浏览 2 评论 0原文

大家好,

在我的 QT 应用程序中,我使用 OpenMP 并行化循环。在循环中,我想更新当前 QMainWindow 的进度条值。 以下代码片段显示了我如何尝试执行此操作:

#ifdef OPENMP_ENABLE
#pragma omp parallel for
#endif

for (int i = 0; i < endIndex; i++) {
  getMainWindow()->setProgress(currProg); //change the value of QProgressBar
 QApplication::processEvents(); //update events,widgets

                  //Do some processing
 }

这里 getMainWindow()->SetProgress() 方法只是更改附加到 QMainWindow 状态栏的 QProgressbar 的值。

在启用 OpenMP 的情况下编译并运行应用程序时,会出现以下错误:

ASSERT 失败 QCoreApplication::sendEvent: “不能 将事件发送到 a 拥有的对象 不同的线程。当前线程 161975a0。接收者“主窗口类” (类型为“MainWindow”)创建于 线程 13d78f8”,文件 kernel\qcoreapplication.cpp,第 348 行

如何使用 OpenMP 调用 QApplication::processEvents() 的任何提示吗?

提前致谢。

Greetings all,

In my QT application, I use OpenMP to parallelize loops.In the loop , I want to update progressbar values of the current QMainWindow.
Following code snippet shows how I am trying to do this :

#ifdef OPENMP_ENABLE
#pragma omp parallel for
#endif

for (int i = 0; i < endIndex; i++) {
  getMainWindow()->setProgress(currProg); //change the value of QProgressBar
 QApplication::processEvents(); //update events,widgets

                  //Do some processing
 }

Here getMainWindow()->SetProgress() method simply change the values of the QProgressbar attached to statusbar of the QMainWindow.

When compile and run the application with OpenMP enabled , it gives the following error:

ASSERT failure in
QCoreApplication::sendEvent: "Cannot
send events to objects owned by a
different thread. Current thread
161975a0. Receiver 'MainWindowClass'
(of type 'MainWindow') was created in
thread 13d78f8", file
kernel\qcoreapplication.cpp, line 348

Any tips how to call QApplication::processEvents() with OpenMP ?

Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

一腔孤↑勇 2024-10-21 20:51:16

子类化 QThread 并将您的业务逻辑放在那里并在那里使用 OpenMP。使用信号和槽来更新 QProgressBar。

您只能在主 GUI 线程中调用 GUI 方法。当您在 OpenMP 线程内部调用 QApplication::processEvents 时,您就违反了此规则。

Subclass QThread and put your business logic there and use OpenMP there. Use signals and slots to update the QProgressBar.

You can only call GUI methods in the main GUI thread. When you call QApplication::processEvents outside of it, inside a OpenMP thread, you break this rule.

┼── 2024-10-21 20:51:16

我认为以下内容也应该有效:

#pragma omp parrallel for
for (int i = 0; i < endIndex; i++) 
{
  #pragma omp single
  {
    getMainWindow()->setProgress(currProg); //change the value of QProgressBar
    QApplication::processEvents(); //update events,widgets
  }
  // Do some processing
}

I suppose the following should also work:

#pragma omp parrallel for
for (int i = 0; i < endIndex; i++) 
{
  #pragma omp single
  {
    getMainWindow()->setProgress(currProg); //change the value of QProgressBar
    QApplication::processEvents(); //update events,widgets
  }
  // Do some processing
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文