<b>Windows服务编写原理及探究(4)</b>[VC/C++编程]
本文“<b>Windows服务编写原理及探究(4)</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
(四)一些问题的谈论
前面几章的内容都是服务的一些通用的编写原理,但里面隐含着一些问题,编写简单的服务时看不出来,但碰到复杂的利用就会呈现一些问题,所以本章就是用来解析、办理这些问题的,实用于高级利用的开辟人员.我这一章的内容都是经过实行得到的,很有实际意义.
我在第一章里面就说过,是由一个服务的主线程履行CtrlHandler函数,它将收到各种掌握号令,但是真正处理号令,履行操作的是ServiceMain的线程.目前,当一个SERVICE_CONTROL_STOP到达之后,你作为一个开辟者,要怎样终止这个服务?在我看过的一些源代码里,大部份只是简单的调用TerminateThread函数去强行杀掉服务进程.但应当稍稍有点线程编程的常识就应当知道TerminateThread函数是可用的调用中最为糟糕的一个,服务线程将得不到任何机会去做应当的清理工作,诸如排除内存、释放核心对象,Dlls也得不到任何线程已经被毁的告诉.
所以终止服务的得当办法是以某种方法激活服务线程,让它终止持续供应服务功效,然后履行完当前操作和排除工作后返回.这就表示你必须在CtrlHandler线程和ServiceMain线程之间履行得当的线程通信.目前已知的最好的内部线程通信机制是I/O Completion Port(I/O 完成端口),假定你编写的是一个大型的服务,需求同时处理为数众多的恳求,并且运行在多处理器系统上面,这个模子便可以供应最佳的系统性能.但也正因为它的复杂性较高,在小规模的利用上面不值得耗费很多的时间和精神,这时作为开辟者可以得当的选取别的的通信方法,诸如异步历程调用行列、套接字和窗口消息,以适应实际情形.
开辟服务时的别的一个重要问题就是调用SetServiceStatus函数时的全部状况报告问题.很多的服务开辟者为了在什么时刻调用SetServiceStatus的问题而常常产生争辩,普通举荐的办法就是:先调用SetServiceStatus函数,报告SERVICE_STOP_PENDING状况,然后将掌握代码传给服务线程大概再成立一个新的线程,让它去持续履行操作,当该线程行将履行完操作之前,再由它将服务的状况设置成SERVICE_STOPPED,然后服务恰好终止.
以上是“<b>Windows服务编写原理及探究(4)</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |