C++ 是否应在ServiceMain上创建新线程?
MSDN说: ServiceMain函数应创建一个全局事件,在此事件上调用RegisterWaitForSingleObject函数,然后退出。这将终止运行ServiceMain函数的线程,但不会终止服务C++ 是否应在ServiceMain上创建新线程?,c++,windows,winapi,windows-services,C++,Windows,Winapi,Windows Services,MSDN说: ServiceMain函数应创建一个全局事件,在此事件上调用RegisterWaitForSingleObject函数,然后退出。这将终止运行ServiceMain函数的线程,但不会终止服务 所以问题是:应该在ServiceMain函数中创建一个新线程来执行服务代码,或者我可以简单地将服务设置为运行状态并使用ServiceMain线程来运行服务代码?如果使用ServiceMain线程运行服务代码,则SCM将保持锁定状态,即使服务状态设置为RUNNING?我不认为MSDN中该语句描述
所以问题是:应该在ServiceMain函数中创建一个新线程来执行服务代码,或者我可以简单地将服务设置为运行状态并使用ServiceMain线程来运行服务代码?如果使用ServiceMain线程运行服务代码,则SCM将保持锁定状态,即使服务状态设置为RUNNING?我不认为MSDN中该语句描述的实现服务的方法是唯一可能的方法。这将与MSDN服务示例相矛盾。在本例中,服务在调用ServiceMain的同一线程中等待事件。这种方式可能更适合于使用单个线程就可以正常工作的简单服务 如果选择以不必显式创建线程的方式使用RegisterWaitForSingleObject。RegisterWaitForSingleObject的MSDN页面上说:“新的等待线程会在需要时自动创建。”在退出ServiceMain之前,您必须打开服务将要监视的I/O通道,并将其句柄绑定到线程池。MSDN:“服务控制管理器(SCM)等待,直到服务报告状态为
service\u RUNNING
。建议服务尽快报告此状态,因为在此期间系统中需要与SCM交互的其他组件将被阻止。”
控制调度器创建一个新线程来执行服务的ServiceMain函数。ServiceMain功能应执行这些任务
五,。。执行服务任务,或者,如果没有挂起的任务,则将控制权返回给调用者。服务状态的任何变化都会导致
调用SetServiceStatus
以报告新的状态信息
从下面的示例可以看出,您可以在ServiceMain函数中执行更复杂的初始化任务,例如创建其他线程
创作指南