【问题标题】:QCoreApplication event loop and Windows Service Control Handler FunctionQCoreApplication 事件循环和 Windows 服务控制处理函数
【发布时间】:2017-04-26 10:38:36
【问题描述】:

我需要两个事件循环:一个用于 Windows 服务(或 Linux 守护进程),另一个用于 Qt 事件队列QCoreApplication::exec()(或QApplication::exec() 甚至 QEventLoop::exec())。

我可以在单线程中同时拥有两者吗?或者我应该为其中一个创建一个单独的线程?后一种情况下QObjects与“window”/“service”线程的交互过程应该如何安排?

Windows 服务 需要Message only window 以及窗口过程 来接收和处理来自Windows 的消息,或者服务控制处理函数。我希望能够处理来自 WindowsQt 的两种事件。

我可以使用QEventLoop/QCoreApplication/QApplication::processEvents 来处理来自Windows 的事件之间的Qt 事件吗?它如何影响服务响应能力和QTimer 响应能力?

【问题讨论】:

  • 尝试使用QCoreApplication::installNativeEventFilter
  • @ramzes2 感谢您的指导。
  • @ramzes2 这只是关于事件过滤器。但是我需要的事件的起源是什么?如何生成它们?
  • 您要处理哪种类型的 Windows 消息?您的应用程序真的是 Windows 服务还是只是无窗口进程?
  • @ramzes2 我的应用程序是 Windows 服务。我想将服务控制消息混合到 Qt 消息队列中。

标签: c++ multithreading qt windows-services event-loop


【解决方案1】:

尝试使用 QtService 库。 QtService 对于开发 Windows 服务和 Unix 守护进程很有用: https://github.com/qtproject/qt-solutions/tree/master/qtservice

或者,您可以像在 QtService 库中一样自己实现它: https://github.com/qtproject/qt-solutions/blob/master/qtservice/src/qtservice_win.cpp#L556

【讨论】:

    【解决方案2】:

    Qt 事件循环在所有平台上集成了本机通知/事件。 nativeEventFilter 是您在需要时对原生事件做出反应的方式。

    【讨论】:

    • 也许我只是不明白QCoreApplication 怎么知道它应该调用RegisterServiceCtrlHandlerEx。每当我构造它时,它是QCoreApplication构造期间的强制性部分吗?
    • 不,这取决于你。但是因为 Qt 旋转了一个本地 Windows 事件泵,所以服务处理程序将照常处理。
    猜你喜欢
    • 2010-11-20
    • 1970-01-01
    • 2015-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多