CloseHandle能確實將Thread由記憶體中移除嗎 |
答題得分者是:lu
|
tigerliu0319
一般會員 發表:1 回覆:2 積分:0 註冊:2008-02-16 發送簡訊給我 |
各位前輩小弟最近在寫一隻DLL利用Thread來拆解字串的DLL,DLL裡有兩個FUNCTION,一個是
將Thread NEW起來執行,另一個FUNCTION是將Thread Terminate後並用CloseHandle釋放 Thread,但是由於這之DLL會被一直應用程式呼叫執行並且這兩個FUNCTION會一直被執行, 也就是開啟Thread後等做完拆解字串後會再用另一個FUNCTION關掉Thread,這兩個程序執行 上並無問題,但是我看了工作管理員中的執行序數字並不會因為CloseHandle就減少,而會隨 著開啟Thread而變多,所以在AP執行一段時間後(9小時左右)工作管理員中的執行序數字由於原本 的3百多飆到2千多,然後就出現錯誤跳了出來,所以想請問各位是否CloseHandle並不會將 Thread釋放掉而非等到AP關掉並釋放DLL時才會將Thread由記憶體中移除,謝謝各位。 編輯記錄
|
johnpage
初階會員 發表:0 回覆:79 積分:40 註冊:2004-08-07 發送簡訊給我 |
|
tigerliu0319
一般會員 發表:1 回覆:2 積分:0 註冊:2008-02-16 發送簡訊給我 |
你好謝謝你的回復,其實我並不是要做多工而是我這隻DLL是要Implement某個協會制訂的COM元件,
所以這兩個FUNCTION是規定一定要實現,我原本是想把NEW Thread這個寫在DLL一開始被啟動的時 候,但是由於這個Thread會去接收RS-232資料後再去拆解字串,而協會規定上不能在一開始就將 RS-232佔住也必須寫在啟動的那個FUNCTION裡才行,所以我才無法把NEW Thread放在DLL一開始 被呼叫時,而後來再做測試時發現如果長時間頻繁的切換這兩個FUNCTION時就會發生Thread的數量 一直增加,而CloseHandle後卻不會減少,必須AP整個關閉後才會被釋放。 ===================引 用 johnpage 文 章=================== Thread來拆解字串的DLL 想做多工? 速度真的有比較快嗎? 如果是想做多工,方向可能走錯. |
wolfling
初階會員 發表:5 回覆:20 積分:25 註冊:2007-10-05 發送簡訊給我 |
|
lu
高階會員 發表:11 回覆:189 積分:195 註冊:2003-11-19 發送簡訊給我 |
我猜你是用 CreateThread 或是 _beginthreadex 來產生 Thread ,是吧?
先糾正一個觀念 Tread 的Terminate 不是用 CloseHandle,且該 Handle 可以一產生Thread 之後馬上就呼叫 CloseHandle ,且THREAD會正常運行 若要強迫關閉一個THREAD,是用TerminateThread ,如果你是用 TerminateThread 來關閉一個Thread 那該 THREAD 所佔用之資源並沒有被釋放掉,詳情請參閱該FUNCTION之解說,所以非必要關頭,不要用TerminateThread 至於啥是必要關頭~~請參閱該FUNCTION之解說 正確的方式,應該是程式中利用各種方式,通知該THREAD要關閉,由該THREAD自行關閉,才是正確的方式 範例如下,當呼叫 Terminated_Thread 會將 Terminated_Flag 設為 True ,然後該THREAD偵測到就結束,換句話說應該是離開 TestThread_Fun(void *p) 這個 Function 不過這是簡易寫法,一般來說,我自己大多是用 Event , Mutex 或其他同步機制來通知 可以考慮用TThread 來寫程式 [code cpp] bool Terminated_Flag = false; void Start_New_Thread() { DWORD ThreadID; HANDLE hthread = CreateThread (0,0,TestThread_Fun,(LPVOID)0,0,(DWORD far *)&ThreadID); CloseHandle (hthread); } void Terminated_Thread () { Terminated_Flag = true; } DWORD CALLBACK TestThread_Fun(void *p) { while(!Terminated_Flag) { //其他程式碼 } } [/code] ===================引 用 tigerliu0319 文 章=================== 各位前輩小弟最近在寫一隻DLL利用Thread來拆解字串的DLL,DLL裡有兩個FUNCTION,一個是 將Thread NEW起來執行,另一個FUNCTION是將Thread Terminate後並用CloseHandle釋放 Thread,但是由於這之DLL會被一直應用程式呼叫執行並且這兩個FUNCTION會一直被執行, 也就是開啟Thread後等做完拆解字串後會再用另一個FUNCTION關掉Thread,這兩個程序執行 上並無問題,但是我看了工作管理員中的執行序數字並不會因為CloseHandle就減少,而會隨 著開啟Thread而變多,所以在AP執行一段時間後(9小時左右)工作管理員中的執行序數字由於原本 的3百多飆到2千多,然後就出現錯誤跳了出來,所以想請問各位是否CloseHandle並不會將 Thread釋放掉而非等到AP關掉並釋放DLL時才會將Thread由記憶體中移除,謝謝各位。 |
tigerliu0319
一般會員 發表:1 回覆:2 積分:0 註冊:2008-02-16 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |