长时间例行后的Qt事件冻结我的申请一段时间

时间:2011-12-07 21:42:42

标签: c++ qt event-handling

所以,我有一个单线程应用程序,它从一组文件中加载数据:

QStringList qFiles = QFileDialog::getOpenFileNames(
    this,
    "Choose Image Files",
    "",
    "Dicom Files(*.dcm);;All Files(*)"
);

之后我调用一个将解析文件集的库,因为库调用了OpenGL函数,我可能无法为此处理创建新线程。 完成此处理后,我注意到我的应用程序冻结了一段时间。

使用GDB我注意到我的Qt应用程序缓存了很多事件,而库处理了一组文件,然后处理这些事件。

我可能不会在libary中调用QApplication :: instance() - > processEvents(),因为它不知道Qt(项目决策)。

有没有办法丢弃这些事件?或者还有其他解决方案可以防止我的申请冻结吗?

1 个答案:

答案 0 :(得分:1)

将OpenGL渲染移动到工作线程

如果可能,将OpenGL渲染移动到单独的线程。然后你可以在那里调用你的库函数,而不用担心它们会阻塞事件队列。

您应该能够将帧缓冲区用于工作线程,并使用信号和插槽与其进行通信。

替代方案:实施进度回调

或者你可以看看该库是否有任何回调。如果您有可用的源,则可以在长时间运行期间实现自己的源。