麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > Java > 正文

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

2019-09-06 23:33:40
字體:
來源:轉載
供稿:網友

                    (四)一些問題的討論

  前面幾章的內容都是服務的一些通用的編寫原理,但里面隱含著一些問題,編寫簡單的服務時看不出來,但遇到復雜的應用就會出現一些問題,所以本章就是用來分析、解決這些問題的,適用于高級應用的開發人員。我這一章的內容都是經過實驗得到的,很有實際意義。

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

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

  開發服務時的另外一個重要問題就是調用SetServiceStatus函數時的所有狀態報告問題。很多的服務開發者為了在什么時候調用SetServiceStatus的問題而常常產生爭論,一般推薦的方法就是:先調用SetServiceStatus函數,報告SERVICE_STOP_PENDING狀態,然后將控制代碼傳給服務線程或者再建立一個新的線程,讓它去繼續執行操作,當該線程即將執行完操作之前,再由它將服務的狀態設置成SERVICE_STOPPED,然后服務正好停止。

  上面的主意從兩個方面來講還是很不錯的。首先服務可以立即確認收到了控制代碼,并將在它認為適當的時候進行處理;然后就是因為前面說過的,執行CtrlHandler函數的是主線程,如果按照這種工作方法,CtrlHandler函數可以迅速的返回,不會影響到其它服務可能收到的控制請求,對含有多個服務的程序來說,響應各個服務的控制代碼的速度會大大的提高。可是,隨之而來的是問題 主站蜘蛛池模板: 99精品电影 | 911精品影院在线观看 | 欧美精品一级片 | 91精品国产综合久久久动漫日韩 | 激情视频日韩 | 欧美 国产 综合 | 羞羞网站在线看 | 在线播放视频一区二区 | 国产精品欧美久久久久一区二区 | 97中文| 在线成人免费观看视频 | 深夜免费观看视频 | 成人免费毛片片v | 午夜精品福利视频 | 欧美高清另类自拍视频在线看 | 久色视频网站 | 国产污污视频 | 秋霞a级毛片在线看 | 久久久久久久高清 | 久久久一区二区三区四区 | 精品亚洲夜色av98在线观看 | 久久久噜噜噜久久熟有声小说 | 91精品国产乱码久久桃 | 国产女同疯狂激烈互摸 | 综合图区亚洲 | 日韩视频在线一区二区三区 | 成人免费毛片在线观看 | 国产精品成aⅴ人片在线观看 | 久久亚洲精品久久国产一区二区 | 天天夜干 | 久久网国产精品 | 亚洲日本欧美 | 亚洲性生活免费视频 | 欧美成人一区二区三区电影 | 中文字幕亚洲视频 | wwwxxx国产 | 国产精品jk白丝蜜臀av软件 | 狠狠操天天射 | 日本在线不卡一区二区 | 草久免费 | 国产毛片毛片 |