【发布时间】:2019-01-15 18:40:56
【问题描述】:
我正在用 C 语言编写一个 Windows 服务,使用这里的经典示例: https://docs.microsoft.com/en-us/windows/desktop/Services/svc-cpp。我试图了解为什么我的服务在不执行任何操作时的 CPU 使用率为 25%。
我已经取出了几乎所有的代码,只留下了原始的骨架程序。基本上它处于一个紧密的循环中,它检查服务停止命令,然后是 Sleep(0),然后循环回来。在我的真实代码中,我正在侦听一个 tcp 连接,但这在本次测试中不适用。
VOID SvcInit( DWORD dwArgc, LPTSTR *lpszArgv)
{
// initialization code not shown here
// Main loop
while(TRUE) {
// Check whether to stop the service.
ret=WaitForSingleObject(ghSvcStopEvent, 0);
if (ret == 0) {
com_Log("Stop command received from service manager");
break;
}
Sleep(0);
// This is where the service looks for work to do, but disabled for
testing
}
// shutdown code here
}
我认为 Sleep(0) 是将控制权返回给操作系统,那么为什么这段代码会出现异常并占用如此大的 CPU 资源?
【问题讨论】:
-
您希望 Sleep(0;) 在限制您的服务时实际做什么?
-
自 Windows 95 以来,当抢先式多任务处理到来时,睡眠并没有恢复对操作系统的控制。它只是让你的进程或线程休眠,仅此而已。操作系统始终处于控制之中。
-
根本不使用
Sleep,只需将第二个参数的非零值传递给WaitForSingleObject,并在它返回WAIT_TIMEOUT时执行您的服务的工作。根据您的服务所需的响应时间确定超时。大约 200 毫秒的超时应该足够了,您可以轻松地增加它。