【问题标题】:Timeout when trying to access QtDBus Objects that where created in a Windows system service尝试访问在 Windows 系统服务中创建的 QtDBus 对象时超时
【发布时间】:2016-01-14 04:16:03
【问题描述】:

我想使用 QT/MinGW 创建一个 Windows 系统服务,该服务通过 DBUS(来自 freedesktop.org)与其他应用程序通信。目前 DBUS 作为“服务”运行,意味着它是使用 instsrv/srvany 工具作为服务安装的(但是,DBUS 稍后将获得它的 bus-service-win)。由于作为服务运行,DBUS 作为系统总线运行。

我编写了一个简单的应用程序来确保 DBUS 正常工作(使用 1 种方法在简单对象上创建并使用 QDBusViewer 执行它)。嗯,这行得通。

接下来,我尝试在我的服务的 ServiceMain 中使用相同的 DBUS 内容,其中 ServiceMain 是我们自己创建的类的成员)。我可以在 QDBusViewer 中看到该对象,但是当我选择它时,QDBusViewer 在卡住了一段时间后报告了超时(没有回复)。

我在我的测试应用程序中看到了这种行为,并且可以通过在创建 DBus 对象后在 app.exec() 上创建 QCoreApplication“应用程序”和“块”来修复它。我在服务中尝试了同样的方法,但得到了一个警告,说 QCoreApplication 没有在主线程中创建,问题仍然存在。

我尝试在调用 StartServiceControlDispatcher() 的函数中创建“app”并在 ServiceMain 中运行 app.exec,但 app.exec() 立即退出并出现错误“必须从主线程调用”。

我该如何克服这个问题?之前非常感谢。

【问题讨论】:

    标签: windows qt service dbus


    【解决方案1】:

    将我自己的服务类与“QT 解决方案”中的 QtService 类进行比较解决了我的问题。

    毕竟,我需要将 StartServiceControlDispatcher() 函数放入 QThread 并更改我的服务类的方法,以便 exec() 仅在绝对在 SCM 的上下文中运行时才执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 2017-11-13
      • 2017-03-05
      • 1970-01-01
      • 2023-02-08
      相关资源
      最近更新 更多