Windows服务如何在停止时执行代码

kevinmartin 2011-08-05 09:34:42
我做了一个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();
}
...全文
80 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧