首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Windows服务SERVICE_WIN32_OWN_PROCESS运行QT5.10事件循环操作

Windows服务SERVICE_WIN32_OWN_PROCESS运行QT5.10事件循环操作
EN

Stack Overflow用户
提问于 2017-11-07 16:25:31
回答 1查看 474关注 0票数 0

到目前为止,我收集到:

  • Windows内部手册
  • MSDN C++服务实现示例
  • Qt-解决方案QtProject/QtService

问题是来自Qt-解决方案的示例服务没有运行事件循环。它使用的是QCoreApplication,但在某种程度上,exec()不启动事件循环(使用线程吗?)它必须与项目有点老(上一次真正的更新是在3年前添加的)和QT5.10有点新有关。修复可能并不难,但我想了解如何设计整个东西。我宁愿自己找问题,但如果有人想检查,我也会接受这个答案。

我理解windows服务程序应该是这样的:

此设置中至少有两个线程。第一个(T1)是为可执行文件创建的,入口点通常是main(),它应该调用块的StartServiceCtrlDispatcher()。它将函数指针传递给服务主函数。让我们称它为SvcMain()。

系统将创建另一个线程(T2),入口点为SvcMain(),它应该尽快运行RegisterServiceCtrlHandler(),将另一个函数注册为服务控制处理程序,让我们称之为SvcCtrlHandler(),然后执行它应该做的事情。

在微软的例子中,SvcCtrlHandler()通过SetSignal() / WaitForSingleObject()发出信号,这并不是真正有用的方法,因为它会阻止SvcMain的执行,但这并不重要(我认为)。

问题如下:

1) Qt事件循环应该合并到第二个线程中。能否简单地通过创建QCoreApplication并从SvcMain()调用exec来实现这一点?

2)服务经理将如何发送服务信号?它在线程SvcCtrlHandler()中运行T1吗?如果这是正确的,那么为什么我必须从T2注册它呢?

3)如果以上所述是正确的,我需要在T1中创建Qt事件而不运行Qt事件循环,或者使用其他基于windows的机制?

4)我可以和T2的服务经理回话,告诉他们我听到了吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-07 20:07:18

服务经理将如何发送服务信号?

它(反复)使用适当的参数(SERVICE_CONTROL_XXX)调用SERVICE_CONTROL_XXX()。SvcCtrlHandler()可以与T2 (SvcMain())通信。

它在线程SvcCtrlHandler()中运行T1吗?如果这是正确的,那么为什么我必须从T2注册它呢?

让我们这样说: SvcCtrlHandler()在线程中运行,这个线程名为StartServiceCtrlDispatcher() (通常是T1)。但是,必须在调用RegisterServiceCtrlHandler()之后(使用StartServiceCtrlDispatcher() )注册它,因此不能在同一个线程中注册。

我可以和T2的服务经理回话,告诉他们我听到了吗?

是的,通过使用SetServiceStatus() WinAPI,但是有不同的状态要向SCM报告。因此,您可以同时从SvcCtrlHandler()和SvcMain()调用SvcMain()。例如,SvcCtrlHandler()报告SERVICE_STOP_PENDING,向T2发送信号,然后简单地返回,而SvcMain()报告SERVICE_STOPPED和退出。

问题是来自Qt-解决方案的示例服务没有运行事件循环。它使用的是QCoreApplication,但不知何故exec()不启动事件循环

我不知道你在看哪个版本的Qt-解决方案,但是在我的计算机中找到一个(非常旧的)解决方案,我发现它们实际上已经在T1中运行了。但是,有一个窍门: StartServiceCtrlDispatcher()是从专用的T3线程调用的,因此T1不会被SCM阻塞。因此,我们让T1运行QCoreApplication的事件循环;T2运行SvcMain();以及在需要时由SCM使用T3来调用SvcCtrlHandler()。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47162803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档