Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否应在ServiceMain上创建新线程?_C++_Windows_Winapi_Windows Services - Fatal编程技术网

C++ 是否应在ServiceMain上创建新线程?

C++ 是否应在ServiceMain上创建新线程?,c++,windows,winapi,windows-services,C++,Windows,Winapi,Windows Services,MSDN说: ServiceMain函数应创建一个全局事件,在此事件上调用RegisterWaitForSingleObject函数,然后退出。这将终止运行ServiceMain函数的线程,但不会终止服务 所以问题是:应该在ServiceMain函数中创建一个新线程来执行服务代码,或者我可以简单地将服务设置为运行状态并使用ServiceMain线程来运行服务代码?如果使用ServiceMain线程运行服务代码,则SCM将保持锁定状态,即使服务状态设置为RUNNING?我不认为MSDN中该语句描述

MSDN说:

ServiceMain函数应创建一个全局事件,在此事件上调用RegisterWaitForSingleObject函数,然后退出。这将终止运行ServiceMain函数的线程,但不会终止服务


所以问题是:应该在ServiceMain函数中创建一个新线程来执行服务代码,或者我可以简单地将服务设置为运行状态并使用ServiceMain线程来运行服务代码?如果使用ServiceMain线程运行服务代码,则SCM将保持锁定状态,即使服务状态设置为RUNNING?

我不认为MSDN中该语句描述的实现服务的方法是唯一可能的方法。这将与MSDN服务示例相矛盾。在本例中,服务在调用ServiceMain的同一线程中等待事件。这种方式可能更适合于使用单个线程就可以正常工作的简单服务

如果选择以不必显式创建线程的方式使用RegisterWaitForSingleObject。RegisterWaitForSingleObject的MSDN页面上说:“新的等待线程会在需要时自动创建。”在退出ServiceMain之前,您必须打开服务将要监视的I/O通道,并将其句柄绑定到线程池。

MSDN:“服务控制管理器(SCM)等待,直到服务报告状态为
service\u RUNNING
。建议服务尽快报告此状态,因为在此期间系统中需要与SCM交互的其他组件将被阻止。”

控制调度器创建一个新线程来执行服务的ServiceMain函数。ServiceMain功能应执行这些任务

五,。。执行服务任务,或者,如果没有挂起的任务,则将控制权返回给调用者。服务状态的任何变化都会导致 调用
SetServiceStatus
以报告新的状态信息

从下面的示例可以看出,您可以在ServiceMain函数中执行更复杂的初始化任务,例如创建其他线程

创作指南