问候所有人,
在我的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()的任何提示?
提前致谢。
答案 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
}