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

时间:2011-01-28 07:00:40

标签: c++ qt4 parallel-processing openmp

问候所有人,

在我的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() - &gt; SetProgress()方法只需更改附加到QMainWindow状态栏的QProgressbar的值。

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

  

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

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

提前致谢。

2 个答案:

答案 0 :(得分:2)

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

您只能在主GUI线程中调用GUI方法。当您在其外部调用QApplication :: processEvents时,在OpenMP线程内部,您将破坏此规则。

答案 1 :(得分:0)

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

#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
}