国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Java > 正文

Windows服務(wù)編寫原理及探討(4)

2019-09-06 23:33:40
字體:
供稿:網(wǎng)友

                    (四)一些問題的討論

  前面幾章的內(nèi)容都是服務(wù)的一些通用的編寫原理,但里面隱含著一些問題,編寫簡(jiǎn)單的服務(wù)時(shí)看不出來,但遇到復(fù)雜的應(yīng)用就會(huì)出現(xiàn)一些問題,所以本章就是用來分析、解決這些問題的,適用于高級(jí)應(yīng)用的開發(fā)人員。我這一章的內(nèi)容都是經(jīng)過實(shí)驗(yàn)得到的,很有實(shí)際意義。

  我在第一章里面就說過,是由一個(gè)服務(wù)的主線程執(zhí)行CtrlHandler函數(shù),它將收到各種控制命令,但是真正處理命令,執(zhí)行操作的是ServiceMain的線程。現(xiàn)在,當(dāng)一個(gè)SERVICE_CONTROL_STOP到達(dá)之后,你作為一個(gè)開發(fā)者,要怎樣停止這個(gè)服務(wù)?在我看過的一些源代碼里,大部分只是簡(jiǎn)單的調(diào)用TerminateThread函數(shù)去強(qiáng)行殺掉服務(wù)進(jìn)程。但應(yīng)該稍稍有點(diǎn)線程編程的常識(shí)就應(yīng)該知道TerminateThread函數(shù)是可用的調(diào)用中最為糟糕的一個(gè),服務(wù)線程將得不到任何機(jī)會(huì)去做應(yīng)該的清理工作,諸如清除內(nèi)存、釋放核心對(duì)象,Dlls也得不到任何線程已經(jīng)被毀的通知。

  所以停止服務(wù)的適當(dāng)方法是以某種方式激活服務(wù)線程,讓它停止繼續(xù)提供服務(wù)功能,然后執(zhí)行完當(dāng)前操作和清除工作后返回。這就表示你必須在CtrlHandler線程和ServiceMain線程之間執(zhí)行適當(dāng)?shù)木€程通信。現(xiàn)在已知的最好的內(nèi)部線程通信機(jī)制是I/O Completion Port(I/O 完成端口),假如你編寫的是一個(gè)大型的服務(wù),需要同時(shí)處理為數(shù)眾多的請(qǐng)求,并且運(yùn)行在多處理器系統(tǒng)上面,這個(gè)模型就可以提供最佳的系統(tǒng)性能。但也正因?yàn)樗膹?fù)雜性較高,在小規(guī)模的應(yīng)用上面不值得花費(fèi)很多的時(shí)間和精力,這時(shí)作為開發(fā)者可以適當(dāng)?shù)倪x取其它的通信方式,諸如異步過程調(diào)用隊(duì)列、套接字和窗口消息,以適應(yīng)實(shí)際情況。

  開發(fā)服務(wù)時(shí)的另外一個(gè)重要問題就是調(diào)用SetServiceStatus函數(shù)時(shí)的所有狀態(tài)報(bào)告問題。很多的服務(wù)開發(fā)者為了在什么時(shí)候調(diào)用SetServiceStatus的問題而常常產(chǎn)生爭(zhēng)論,一般推薦的方法就是:先調(diào)用SetServiceStatus函數(shù),報(bào)告SERVICE_STOP_PENDING狀態(tài),然后將控制代碼傳給服務(wù)線程或者再建立一個(gè)新的線程,讓它去繼續(xù)執(zhí)行操作,當(dāng)該線程即將執(zhí)行完操作之前,再由它將服務(wù)的狀態(tài)設(shè)置成SERVICE_STOPPED,然后服務(wù)正好停止。

  上面的主意從兩個(gè)方面來講還是很不錯(cuò)的。首先服務(wù)可以立即確認(rèn)收到了控制代碼,并將在它認(rèn)為適當(dāng)?shù)臅r(shí)候進(jìn)行處理;然后就是因?yàn)榍懊嬲f過的,執(zhí)行CtrlHandler函數(shù)的是主線程,如果按照這種工作方法,CtrlHandler函數(shù)可以迅速的返回,不會(huì)影響到其它服務(wù)可能收到的控制請(qǐng)求,對(duì)含有多個(gè)服務(wù)的程序來說,響應(yīng)各個(gè)服務(wù)的控制代碼的速度會(huì)大大的提高??墒牵S之而來的是問題 主站蜘蛛池模板: 榆林市| 康马县| 黄冈市| 那坡县| 收藏| 鸡泽县| 彩票| 犍为县| 开封县| 佳木斯市| 虞城县| 黄平县| 丽水市| 饶平县| 紫金县| 博野县| 五家渠市| 甘孜| 双鸭山市| 扬中市| 万州区| 林口县| 广东省| 迁安市| 合肥市| 曲阳县| 招远市| 新丰县| 板桥市| 周口市| 渝北区| 宜春市| 延吉市| 墨脱县| 柘荣县| 巩留县| 宝丰县| 贞丰县| 清水县| 武安市| 固原市|