【问题标题】:Using QTimer from non-Qt DLL (JNA)使用来自非 Qt DLL (JNA) 的 QTimer
【发布时间】:2012-05-25 12:18:52
【问题描述】:

我写了一个库(DLL)。 Java 代码将我的 DLL 与 JNA 一起使用。 在库中,我通过 QThread 派生类中的“new”创建 Qtimer。

但是,我有以下错误:

ERROR: QTimer can only be used with threads started with QThread

在没有 QApplication/QCoreApplication 的情况下,我应该如何正确使用 QTimer 从非 Qt 线程调用?

【问题讨论】:

  • 我认为显而易见的答案是你不能......但如果你不相信我在这里阅读stackoverflow.com/questions/7450044/…
  • 但是,我没有 QCoreApplication。我是否需要创建 QCoreApplication 实例?
  • 引用我给您的链接:“要使用 QTimer,您需要有一个事件循环。您需要使用 QCoreApplication::exec() 启动应用程序事件循环。”
  • 我需要在哪里启动应用程序事件循环?代码中的什么位置?
  • 鉴于 ::exec() 不会返回,您至少需要从专用 (Java) 线程调用它。

标签: java c++ qt jna qt-mfc-migration


【解决方案1】:

不幸的是,据我所知,QTimer 需要 QCoreApplication。而且 QCoreApplication 必须在创建我看到的第一个 QObject 的线程中实例化。我所做的是将 QCoreApplication 实例化为使用QtConcurrent::run 生成的新线程,并在其中实例化我的 QObjects。我报告了一个简单的例子here。 QTimer 现在似乎可以正常工作了。

【讨论】:

    【解决方案2】:

    看看QBasicTimer。我不能 100% 确定这是否可行,但至少文档没有提到 QThreads 和事件循环(与 QTimer 类的文档相反)。

    缺点是它有点复杂(它在你的QObject 中调用timerEvent() 重新实现,没有信号槽连接),但如果它是真的,你可以在没有事件循环的情况下使用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-10
      • 2014-05-06
      • 1970-01-01
      • 2012-03-15
      • 1970-01-01
      相关资源
      最近更新 更多