線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:6277
推到 Plurk!
推到 Facebook!

CloseHandle能確實將Thread由記憶體中移除嗎

答題得分者是:lu
tigerliu0319
一般會員


發表:1
回覆:2
積分:0
註冊:2008-02-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-02-16 23:22:13 IP:123.193.xxx.xxx 訂閱
各位前輩小弟最近在寫一隻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 重新編輯於 2008-02-16 23:24:29, 註解 無‧
tigerliu0319 重新編輯於 2008-02-16 23:26:16, 註解 無‧
johnpage
初階會員


發表:0
回覆:79
積分:40
註冊:2004-08-07

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-02-17 08:48:42 IP:118.167.xxx.xxx 訂閱
Thread來拆解字串的DLL 想做多工?
速度真的有比較快嗎?
如果是想做多工,方向可能走錯.
tigerliu0319
一般會員


發表:1
回覆:2
積分:0
註冊:2008-02-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-02-17 10:29:06 IP:123.193.xxx.xxx 訂閱
你好謝謝你的回復,其實我並不是要做多工而是我這隻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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-02-19 10:31:40 IP:61.222.xxx.xxx 訂閱
Thread Terminate 是API嗎?
我好像沒用過.
是不是TerminateProcess阿 如果是的話 Address確定正確嗎
我之前用的時候 似乎用程式找到的 不一定是實體的Address..
不知道你是不是問這個~
------
work hard bring success
lu
高階會員


發表:11
回覆:189
積分:195
註冊:2003-11-19

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-02-20 18:27:55 IP:203.73.xxx.xxx 訂閱
我猜你是用 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-02-21 12:19:40 IP:220.228.xxx.xxx 訂閱
恩確實像lu大所說得我的thread無法釋放乾淨,我會在嘗試用Event , Mutex 或其他同步機制來將thread關掉看看謝謝大大
系統時間:2024-04-27 3:01:08
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!