应该在 ServiceMain 上创建一个新线程吗?

noh*_*ros 5 c++ windows winapi windows-services

MSDN 说:

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

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

gla*_*lig 3

我不认为 MSDN 声明中描述的实现服务的方式是唯一可能的方式。这与http://msdn.microsoft.com/en-us/library/windows/desktop/bb540476(v=vs.85).aspx上的 MSDN 服务示例相矛盾。在示例中,服务在调用 ServiceMain 的同一线程中等待事件。对于可以在单线程上正常工作的简单服务来说,这种方式可能更好。

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