国产探花免费观看_亚洲丰满少妇自慰呻吟_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之而來的是問題 主站蜘蛛池模板: 株洲市| 望城县| 辽源市| 中西区| 台北县| 容城县| 青冈县| 沙坪坝区| 盘锦市| 左贡县| 巴彦县| 阳信县| 平塘县| 乌鲁木齐县| 南皮县| 定边县| 平和县| 汪清县| 普定县| 慈溪市| 黔江区| 双流县| 阜城县| 修水县| 恩平市| 金秀| 河津市| 万全县| 张北县| 沾益县| 贵定县| 广饶县| 木兰县| 中江县| 大宁县| 遂川县| 昆明市| 来宾市| 白河县| 澄迈县| 昆明市|