在 OpenMP 循环内调用 QApplication::processEvents()?
大家好,
在我的 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
子类化 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.
我认为以下内容也应该有效:
I suppose the following should also work: