应该在ServiceMain上创建一个新的Thread?

时间:2013-02-15 22:50:32

标签: c++ windows windows-services w32

MSDN说:

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

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

2 个答案:

答案 0 :(得分:2)

我认为从MSDN实现该语句所描述的服务的方式并不是唯一可行的方法。这与http://msdn.microsoft.com/en-us/library/windows/desktop/bb540476(v=vs.85).aspx的MSDN服务示例相矛盾。在该示例中,服务等待调用ServiceMain的同一线程中的事件。对于使用单个线程工作得很好的简单服务,这种方式可能更好。

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

答案 1 :(得分:0)

MSDN says:“服务控制管理器(SCM)等待服务报告状态为SERVICE_RUNNING。建议服务尽快报告此状态,如同其他组件一样在此期间,需要与SCM交互的系统将被阻止。“

控制调度程序创建一个新线程来执行服务的ServiceMain函数。 ServiceMain函数应执行following任务。

  

5 ..执行服务任务,或者,如果没有待处理任务,则将控制权返回给调用者。服务状态的任何变化都需要保证   致电SetServiceStatus报告新状态信息。

this示例开始,您可以在ServiceMain函数中执行更复杂的初始化任务,例如创建其他线程。

创建Multithreaded Services的指南。