【问题标题】:Qt Events after a long routine freezes my application for a while长时间的例行程序后的 Qt 事件将我的应用程序冻结了一段时间
【发布时间】:2011-12-07 21:42:41
【问题描述】:

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

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

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

使用 GDB,我注意到我的 Qt 应用程序缓冲了很多事件,而库处理文件集,然后它正在处理这些事件。

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

有没有办法丢弃这些事件?或者有没有其他解决方案可以防止我的应用程序冻结?

【问题讨论】:

  • 你有没有注意到这些是什么类型的事件?另外......虽然库可能不知道Qt......您是否可以将一个函数指针传递给它以进行回调 - 例如在每个文件之后?然后,您可以初始化库并传入一个函数,它调用该函数来进行事件处理(如果回调更有意义或一般有用,那就更好了)。
  • @HostileFork 查看堆栈跟踪:pastebin.com/VEma6KE7 看起来 glib 正在将最近访问的文件信息保存到磁盘。奇怪的是它做了很多次......
  • 无法将 OpenGL 渲染移至单独线程的具体原因是什么?

标签: c++ qt event-handling


【解决方案1】:

将 OpenGL 渲染移至工作线程

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

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

替代方案:实现进度回调

或者,您可以查看库是否有任何回调。如果您有可用的源代码,则可以在长时间运行的操作中实现自己的源代码。

【讨论】:

  • 我同意你的看法,进度回调也已经开始了。但我现在需要一些更快的东西,我想知道是否有办法丢弃这些事件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-20
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 2011-10-16
  • 1970-01-01
  • 2016-03-19
相关资源
最近更新 更多