判斷執行緒是否結束的方法

2022-05-09 02:06:10 字數 1069 閱讀 2315

1、 getexitcodethread

比較原始的方法了,呼叫 getexitcodethread,如果返回still_active,那就是還在執行,否則,會返回退出**.

該方法的優點是除了可以判斷是否已經退出,還可以獲取到退出**,也就是可以判斷退出原因.

該方法在呼叫後,會立即返回,如果需要等待執行緒呼叫,請放在乙個迴圈內迴圈呼叫.

2、waitforsingleobject

聽起來都比較先進的方法.等待執行緒的核心物件被激發,執行緒退出的時候該核心物件就會被激發了

該方法為杜塞函式,會一直堵塞直至執行緒退出.當然,也可以把超時時間設定成0,來讓該函式立即返回.

waitforsingleobject(執行緒控制代碼, 0);如果返回值是wait_object_0則執行緒已結束。

3、自己控制

缺點是,嚴格意義上來說,執行緒記錄變數和執行緒實際退出的時候還是存在小小小小小小小小的時間差(一般情況可以忽略了)

主線程只要擁有執行緒控制代碼,事後就可以對執行緒執行某些操作,比如查詢執行緒狀態等等,靠的就是控制代碼,如果沒有控制代碼,系統就無從知道要查的是那個執行緒的狀態。

但保持這個控制代碼不關閉,並不是執行緒執行的條件。

關閉執行緒控制代碼只是釋放控制代碼資源,新開啟執行緒後,如果不再利用其控制代碼,應該關閉控制代碼,釋放系統資源。關閉執行緒控制代碼和執行緒的結束與否沒有關係。

控制代碼可以認為是系統對資源(如執行緒)的分配的乙個編號。關閉這個編號,對於不同的資源,效果不盡相同。對於執行緒來說,關閉這個編號並不意味著終止執行緒,只是之後很難再操縱這個執行緒。

這就好比摘掉了門牌號,並不傷害這一家人,只是以後往這送信就麻煩些了。

還有,如果主線程只想建立執行緒,而並不想之後再查詢或操縱它,那麼及時關閉控制代碼是個好習慣,免得當時沒關,以後又忘了,於是洩漏了系統的控制代碼資源(系統控制代碼總數是有限的)。

如果知道引用計數是怎麼回事就很好解釋了。

closehandle(hthread) 只是減去乙個hthread的引用計數。

執行緒控制代碼就像你家的位址,執行緒就像你的家房子,

樓主你說如果沒有了你家的位址,難道就沒有你家的房子了嗎?

執行緒與執行緒控制代碼也是一樣的道理,控制代碼只是可以對這個執行緒作一些操作。

判斷執行緒是否全部結束

第一種 使用executorservice.isterminated executorservice cachedthreadpool executors.newcachedthreadpool cachedthreadpool submit new callable cachedthreadpoo...

C 判斷執行緒是否結束Alive

using system using system.collections.generic using system.linq using system.text using system.threading.tasks using system.threading namespace 5006 判...

判斷執行緒是否釋放

判斷執行緒是否釋放 返回值 0 已釋放 1 正在執行 2 已終止但未釋放 3 未建立或不存在 function tfrmmain.checkthreadfreed athread tthread byte var i dword isquit boolean begin if assigned at...