全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3115
推到 Plurk!
推到 Facebook!

如何殺掉無回應的 Thread ?

缺席
robowang
一般會員


發表:2
回覆:6
積分:6
註冊:2003-06-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-07-24 13:09:14 IP:61.216.xxx.xxx 未訂閱
我一個程式開啟數百個執行緒,但執行緒數量一多, 就很容易造成部份執行緒停止回應(死掉了) 那些執行緒執行的程式並沒有出錯, 但執行緒就是沒有分配到 CPU 時間 似乎作業系統已經忘了它們的存在 我想把那些死掉的執行緒給殺掉, 但不知哪個指令可以安全殺掉 dead thread, 同時釋放該執行緒所佔用的資源 ? 請問有誰知道嗎 ?
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-07-24 13:53:51 IP:147.8.xxx.xxx 未訂閱
Using TerminateThread API, but it will not release resource allocated by your threads. Perhaps you should make sure your threads do not take up all the CPU time? Or try to add some kind of sleep within the Execute method of your threads.
aquarius
資深會員


發表:3
回覆:347
積分:330
註冊:2003-05-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-07-24 14:24:42 IP:211.23.xxx.xxx 未訂閱
引言: 我一個程式開啟數百個執行緒,但執行緒數量一多, 就很容易造成部份執行緒停止回應(死掉了) 那些執行緒執行的程式並沒有出錯, 但執行緒就是沒有分配到 CPU 時間 似乎作業系統已經忘了它們的存在 我想把那些死掉的執行緒給殺掉, 但不知哪個指令可以安全殺掉 dead thread, 同時釋放該執行緒所佔用的資源 ? 請問有誰知道嗎 ?
幾百個 THREAD ? .... 那果然是會出問題.... 在 DELPHI 的 HELP 中就有下列這一段... Following are issues and recommendations to be aware of when using threads: Keeping track of too many threads consumes CPU time; the recommended limit is 16 threads per process on single processor systems. 你的問題就如果 WILLIAM 講的用 TerminateThread 應該可以解決. 不過根本之道應該是檢視程式的流程及寫法. 應該是不用開這麼多個 THREAD 來處理才對!! ...Aquarius
------
水瓶男的blog: http://791909.blogspot.com
robowang
一般會員


發表:2
回覆:6
積分:6
註冊:2003-06-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-07-24 14:32:52 IP:61.216.xxx.xxx 未訂閱
多謝 ! 我知道 TerminateThread 指令, 也試過 但 TerminateThread 並不"安全", 會造成程式出錯, 因此我希望能有一種"安全"的方法 可以殺掉 Thread, 又可以釋放資源 當程式使用 ExitProcess 結束時, 那些 dead thread 也會被清除, 所佔用的資源也會被釋放 因此我想或許有某一個指令可以清除某一個 Thread, 並釋放它的資源, 只是不曉得是什麼指令而已 有人知道嗎 ?
robowang
一般會員


發表:2
回覆:6
積分:6
註冊:2003-06-04

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-07-24 14:48:11 IP:61.216.xxx.xxx 未訂閱
突然發覺, 怎麼我的性別被登錄成女的 ? 我是男的 我的一些程式經常開啟大量的執行緒, 比方一百個, 執行都一切正常 Delphi Help 裏面說的 16 個執行緒, 可能是多年前針對 Win98 的建議 現在 Win2000 , Win2003 都可以開啟相當多的 Thread 當然, 幾百個 Thread 對 OS 還是很沉重的負擔, 但數量並不是重點 重點在於:即使我只有三個執行緒, 當其中一個死掉時, 有什麼 API 可以安全清除它 ?
aquarius
資深會員


發表:3
回覆:347
積分:330
註冊:2003-05-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-07-24 15:11:24 IP:211.23.xxx.xxx 未訂閱
引言: 多謝 ! 我知道 TerminateThread 指令, 也試過 但 TerminateThread 並不"安全", 會造成程式出錯, 因此我希望能有一種"安全"的方法 可以殺掉 Thread, 又可以釋放資源 當程式使用 ExitProcess 結束時, 那些 dead thread 也會被清除, 所佔用的資源也會被釋放 因此我想或許有某一個指令可以清除某一個 Thread, 並釋放它的資源, 只是不曉得是什麼指令而已 有人知道嗎 ?
Thread 的指令就這麼幾個. 要由外部去刪除, 一定是會留點東西下來, 因為不是正常結束呀!! 最好的做法應該還是由自己的程式內部控制什麼時候產生, 什麼時候結束. 在自己的程式中應該是不要用到類似 TerminateThread 這種東西. 在正常的狀況下, Thread 也不是那樣容易就掛掉的, 會掛掉多少都和處理方式有關, 事前的規畫應可避免!! 另外個人資料不對, 可以去修改一下呀!!.... 好讓你恢復本 "性"!!.. :) ...Aquarius
------
水瓶男的blog: http://791909.blogspot.com
star
初階會員


發表:37
回覆:93
積分:36
註冊:2002-07-18

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-07-25 00:09:21 IP:61.66.xxx.xxx 未訂閱
引言: 突然發覺, 怎麼我的性別被登錄成女的 ? 我是男的
嘿嘿嘿! 我發現很久了... (各位,對不起插播一下)
robowang
一般會員


發表:2
回覆:6
積分:6
註冊:2003-06-04

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-07-25 00:45:02 IP:61.216.xxx.xxx 未訂閱
star 小姐 ! 別鬧 ! 大人們在討論事情, 小孩子別插嘴 !
avex
初階會員


發表:19
回覆:49
積分:43
註冊:2003-03-28

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-07-25 10:30:02 IP:211.23.xxx.xxx 未訂閱
小弟持 aquarius 大人相同的說法, 若 memory leak 的原因是由你的程式造成, 運用各種資源去刪掉你的 thread 還是無法刪掉你的 leak. 寫程式的人本來就有義務要維持一個程式的完整性, 不單是create你要的資源, 更重要的是你的程式要很 robust, 足以應付各種狀況, 據小弟經驗, 寫 thread 最重要的就是它的離開了, 我甚至都已經創造出一個既定的模式去安全的離開, 甚至是 surprised terminated. 你也應該create 出屬於你的模式. 對於 memory leak, 解鈴還需繫鈴人. 我只能建議你 善用 try...catch ; try...finally
robowang
一般會員


發表:2
回覆:6
積分:6
註冊:2003-06-04

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-07-25 11:06:02 IP:61.216.xxx.xxx 未訂閱
似乎有一點失焦.... 程式本身並沒有問題, 問題出在作業系統不再分配 CPU 時間給某一些 Thread 既然 Thread 沒有獲得 CPU 時間, 也就無法執行任何指令了, 所以什麼 try finally 或 try except 等等指令都沒有意義 如果作業系統能分配一些 CPU 時間給那些 Thread, 則一切都運作得很好 也沒有 memory leak, 也很 robust, 即使是 surprised terminated 也無妨 --- 只要OS給它CPU時間 我在想, 如果是 OS 把那些 Thread 給遺忘了, 那麼我是不是就乾脆把那些 Thread 給殺了 然後建立新的 Thread ? 雖然有 TerminateThread 可用, 但 TerminateThread 並不安全 而我發現 ExitProcess 卻可以將所有的資源釋放得一乾二淨, 即使是 Dead Thread 也會被 ExitProcess 清除 因此, Windows 一定有方法可以安全地殺掉 dead thread, 就像 ExitProcess 所做的那樣 搞不好只是乎叫一個簡單的 Windows API 就可以了, 只是我不曉得是哪一個 API
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-07-25 13:49:45 IP:61.231.xxx.xxx 未訂閱
對不起,各位大人,我這個小孩子來插個嘴  一個執行緒會不會死,其實很難說,我自已也有提到過,我的系統會使用到 > 。如果您可以找出某幾個占 > <>沒空更新的網頁... href="http://dllee.adsldns.org">http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell.... 發表人 - dllee 於 2003/07/25 21:05:45
------
http://www.ViewMove.com
danny
版主


發表:100
回覆:522
積分:595
註冊:2002-03-11

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-07-25 15:36:25 IP:211.76.xxx.xxx 未訂閱
引言: 而如 william 版土所說,我在執行緒中加入了 sleep,並且將執行緒觸發間隔調寬,或是直在執行緒內判讀是否自己已將 CPU 的時間占滿,如果是,就再多 sleep 一下,讓別的執行緒可以動。這樣,就沒有問題了。
dllee 兄: 各位對不起,我也來插個嘴問個問題 請問如何判斷 "
------
將問題盡快結案也是一種禮貌!
aquarius
資深會員


發表:3
回覆:347
積分:330
註冊:2003-05-21

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-07-25 16:00:34 IP:211.23.xxx.xxx 未訂閱
請參考 MSDN 的文件 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/createthread.asp    最主要就是這一段     Remarks The number of threads a process can create is limited by the available virtual memory. By default, every thread has one megabyte of stack space. Therefore, you can create at most 2028 threads. If you reduce the default stack size, you can create more threads. However, your application will have better performance if you create one thread per processor and build queues of requests for which the application maintains the context information. 每個 Thread 吃掉 1MB 的空間, 你的機器上有多少 MEMORY 可以讓這程式用? 這肯定會造成嚴重的 SWAP 現像. 我覺得根本解決之道, 還是在減少 Thread 的使用. 就像 MSDN 建議的, 開一個 Thread 就好, 自己建個 QUEUE, 把工作逐一丟到 Thread 中做, 這樣還比較有效率. ...
------
水瓶男的blog: http://791909.blogspot.com
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-07-25 21:19:04 IP:61.224.xxx.xxx 未訂閱
引言: dllee 兄: 各位對不起,我也來插個嘴問個問題 請問如何判斷 ">< face="Verdana, Arial, Helvetica"> 我的程式有讀取 CPU 的使用率,由此可以看出是否 CPU 已太忙。 另外,我的 Thread 主要是 ThreadTimer ,而我統計了每個 Thread 執行的次數及每次的執行時間,例如:一個 200ms 的 ThreadTimer 結果平均都要執行 180ms 或以上,那其他的幾乎就沒什麼執行到了,也可以去比較其他同樣是 200ms 的 ThreadTimer 執行次數,如此,我可以知道那一個 Thread 最占時間,再由那個 Thread 所做的事去找出占 CPU 時間的原因。
引言: 每個 Thread 吃掉 1MB 的空間, 你的機器上有多少 MEMORY 可以讓這程式用? 這肯定會造成嚴重的 SWAP 現像. 我覺得根本解決之道, 還是在減少 Thread 的使用. 就像 MSDN 建議的, 開一個 Thread 就好, 自己建個 QUEUE, 把工作逐一丟到 Thread 中做, 這樣還比較有效率.
對我的應用來說是還好,整台電腦都歸我的程式(一個單一的程式)使用,而且,我的程式就是 SHELL 了,進入 Windows 後,就只有執行我的程式,連 Explorer 都沒有執行,操作者也沒有開始按鈕、程式集、桌面等東西可以用,記憶體 512MB,這樣開 100 個執行緒應該都算還好吧 <>沒空更新的網頁... href="http://dllee.adsldns.org">http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell.... 發表人 - dllee 於 2003/07/25 22:02:27
------
http://www.ViewMove.com
avex
初階會員


發表:19
回覆:49
積分:43
註冊:2003-03-28

發送簡訊給我
#15 引用回覆 回覆 發表時間:2003-08-07 00:14:47 IP:218.163.xxx.xxx 未訂閱
Thread 分配不到 CPU 時間, 你是全憑感覺? 你如果說是在合作式多工的作業系統的話我認同~ 當然重要的是後面這句話, 反之, 沒有理由.
loverlin
一般會員


發表:1
回覆:35
積分:22
註冊:2002-07-15

發送簡訊給我
#16 引用回覆 回覆 發表時間:2003-08-07 17:41:09 IP:61.228.xxx.xxx 未訂閱
引言: Thread 分配不到 CPU 時間, 你是全憑感覺? 你如果說是在合作式多工的作業系統的話我認同~ 當然重要的是後面這句話, 反之, 沒有理由.
最近幫朋友寫了一套監控系統(根據也說在 PII 450/WinXP 下跑200個鏡頭效能不會太差),也是一個鏡頭一個 Thread ,我發現在多個 Thread 時,用 Sleep 的效果也不見得好 我是用下列的方式,可以給各位參考 procedure TMyThread.Sleep(dwValue : DWORD); var dwStart : DWORD; begin dwStart = GetTickCount; while ( ( Application.Terminated <> True ) and ( Terminated <> True ) and ( bStop = False ) then begin if (GetTickCount - dwStart) >= dwValue then break; Application.ProcessMessage; Sleep(10); end; end; 呼叫 MySleep(10000) 或比呼叫 Sleep(10000) 來的效能更有利用到 也不會造成主畫面(GUI)停頓 kk-boy
------
kk-boy
系統時間:2024-05-03 19:14:37
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!