Windows服务如何在停止时执行代码
我做了一个windows服务,已经完整实现了整个过程:启动--停止。并且程序运行正常。用qt做的。
现在我想增加一个功能:在服务停止的时候做一些事情(耗时的,需要等待的)
原始功能:服务启动后一直去访问某个网站(60分钟1次)。退出时不管线程在干什么,直接w.quit结束。
现在要求增加:服务退出时,再访问一下这个网站,得到结果后退出。
因为qt中的QNetworkAccessManager是异步的,所以发送请求后qt又启动了一个线程load,直到load完成后回调(相当于)networkReplyFinished函数。
我按照其他项目的经验,给线程创建了一个QEventLoop,在quit里启动exec,在networkReplyFinished里停止exit()。这个方式在另外一个项目中可用(不是服务程序,是多线程的相互控制),这里却不好用了。停止服务时,发现这个程序占满了一个CPU,相当于死循环了~~
代码:
停止服务的代码:
case SERVICE_CONTROL_SHUTDOWN:
WriteLog("SERVICE_CONTROL_SHUTDOWN");
{
serviceStatus.dwWin32ExitCode = 0;
serviceStatus.dwCurrentState = SERVICE_STOP_PENDING;
serviceStatus.dwCheckPoint = 0;
serviceStatus.dwWaitHint = 0;
if (!SetServiceStatus(hServiceStatusHandle, &serviceStatus))
{
long nError = GetLastError();
char pTemp[121];
sprintf(pTemp, "SetServiceStatus failed, error code = %d", nError);
WriteLog(pTemp);
}
}
WriteLog("SERVICE_CONTROL_SHUTDOWN - pending quit");
w.quit();
WriteLog("SERVICE_CONTROL_SHUTDOWN - finished quit");
{
serviceStatus.dwWin32ExitCode = 0;
serviceStatus.dwCurrentState = SERVICE_STOPPED;
serviceStatus.dwCheckPoint = 0;
serviceStatus.dwWaitHint = 0;
if (!SetServiceStatus(hServiceStatusHandle, &serviceStatus))
{
long nError = GetLastError();
char pTemp[121];
sprintf(pTemp, "SetServiceStatus failed, error code = %d", nError);
WriteLog(pTemp);
}
}
WriteLog("SERVICE_CONTROL_SHUTDOWN - ready out");
return;
线程的quit代码:
void WorkThread::quit()
{
WriteLog("WorkThread::quit()");
m_refreshTimer->stop();
urlAccess(checkoutUrl, QByteArray(), ACCESS_POST);
m_operatorType = OPERATOR_BEFOREQUIT;
eventLoop->exec();
QThread::quit();
}
线程网络请求返回的回调函数(部分,只包含eventLoop逻辑的代码):
// 如果不包含登陆url,就改变状态
if(m_operatorType == OPERATOR_BEFOREQUIT)
{
eventLoop->exit();
}