系统服务的问题

江南T雨 2010-12-29 09:13:17
写了一个系统服务程序,最近要添加新的功能,就是在服务运行过程中定时检测某个状态,如果状态异常,则服务退出。
这段进行判断的代码应该加在系统服务的那个位置?ServiceMain还是其他的什么地方?
另外如果加在ServiceMain中,要退出服务如何实现?
...全文
81 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2011-01-06
  • 打赏
  • 举报
回复
[Quote=引用楼主 lswx2006 的回复:]
写了一个系统服务程序,最近要添加新的功能,就是在服务运行过程中定时检测某个状态,如果状态异常,则服务退出。
这段进行判断的代码应该加在系统服务的那个位置?ServiceMain还是其他的什么地方?
另外如果加在ServiceMain中,要退出服务如何实现?
[/Quote]

做成服务的目地就是产生一个“死循环”不停的干活,如果有可能将会永不休息(那怕内部只是在sleep(1万年)它也是在干活)地干活,直到累死或崩溃。如果在服务中要实现你说的功能和处理结果,那么你的设计就有问题。因此,你这个检测状态只能是服务当中的一个“任务”而已,不存在退不退出服务的问题。

litao0813 2011-01-06
  • 打赏
  • 举报
回复
// The worker loop of a service
if (ServiceStatus.dwCurrentState == SERVICE_RUNNING)
{
[color=#FF0000]YourServer();[/color] }
return;

YourServer()里直接退出不就可以了吗?
你要看看YourServer()里怎么写的,有的是一个消息循环,有的是一个其它循环,或者启动其它线程。
消息循环就发quit消息,循环或者线程就退出就可以了吧?
qiri07 2010-12-30
  • 打赏
  • 举报
回复
启动一个监控线程(也就是常说的守护线程),检查运行状态
SiGoYi 2010-12-30
  • 打赏
  • 举报
回复
要想停止服务可以用如下代码
线程ID可以在实现服务的方法PreMessageLoop中用GetCurrentThreadID取得,或其它实现服务的方法都可以
SetServiceStatus( SERVICE_STOP_PENDING );
::PostThreadMessage( m_dwThreadID, WM_VCFW_DEVICEEVENTRECEIVER_DESTROY, 0, 0 );
::PostThreadMessage( m_dwThreadID, WM_QUIT, 0, 0 );
SiGoYi 2010-12-30
  • 打赏
  • 举报
回复
服务应该有自己的线程,你可以在线程中做你所需要的判断,当然也可以自己起线程在自己的线程里判断。
jackson35296 2010-12-30
  • 打赏
  • 举报
回复
既然是服务,没事做的时候sleep就可以了,没必要退出吧。如果一定要退出,可以OpenService然后ControlService,向服务发送停止命令试试。再不行,如果是单进程的服务,直接ExitProcess
VC天下 2010-12-30
  • 打赏
  • 举报
回复
这段进行判断的代码可以加在ServiceMain里,调用一个自己的函数,启用多线程监测。

参考一下:http://zh-cn.w3support.net/index.php?db=so&id=704991

以前的代码,不知道有没有参考性:
void ServiceMain(int argc, char** argv)
{
int error;

ServiceStatus.dwServiceType = SERVICE_WIN32;
ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
ServiceStatus.dwWin32ExitCode = 0;
ServiceStatus.dwServiceSpecificExitCode = 0;
ServiceStatus.dwCheckPoint = 0;
ServiceStatus.dwWaitHint = 0;

hStatus = RegisterServiceCtrlHandler("DMSServer2", (LPHANDLER_FUNCTION)ControlHandler);
if (hStatus == (SERVICE_STATUS_HANDLE)0)
{
// Registering Control Handler failed
logger.error("Registering Control Handler failed.\r\n");
return;
}

// Initialize Service
error = InitService();
if (error != 0)
{
// Initialization failed
logger.error("Initialize windows serivce(DMSServer) failed.\r\n");
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
ServiceStatus.dwWin32ExitCode = -1;
SetServiceStatus(hStatus, &ServiceStatus);
return;
}

// We report the running status to SCM.
ServiceStatus.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus(hStatus, &ServiceStatus);

// The worker loop of a service
if (ServiceStatus.dwCurrentState == SERVICE_RUNNING)
{
YourServer(); }
return;
}

另一个函数里:
case SERVICE_CONTROL_SHUTDOWN:
logger.info("The windows serivce(DMSServer) shut down.\r\n");
// shut down DMS server thread
Shutdown(); //自已写的一个

ServiceStatus.dwWin32ExitCode = 0;
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus(hStatus, &ServiceStatus);


fishion 2010-12-30
  • 打赏
  • 举报
回复
不知道能不能用多线程

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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