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

BCB的Tthread問題

答題得分者是:jazz
74205
一般會員


發表:8
回覆:16
積分:4
註冊:2002-10-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-11-15 15:41:10 IP:163.28.xxx.xxx 未訂閱
首先,請問BCB下的執行緒在完成後 會不會自動garbage collection? 另外還有一個問題 我在timer觸發的Tthread中做存檔的動作(SaveToFile) 結果發現timer太快的話(40ms) 好像有些執行緒來不及完成存檔的動作 ex:存檔編號2,4,6,8,11...,若干檔案(0,1,3,5....)都沒存到 不過timer慢時就可以完成0,1,2,3,4...的存檔 這該怎麼辦啊?
lcsboy
版主


發表:87
回覆:622
積分:394
註冊:2002-06-18

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-11-15 18:26:50 IP:211.23.xxx.xxx 未訂閱
會不會自動garbage collection? ^^^^^^^^^^^^^^^^^^^^ 不太懂你的意思耶, 要不要說清楚一點? 這樣正在螢幕前的高手能更快的給 你解答! 好像有些執行緒來不及完成存檔的動作 ^^^^^^^^^^^^^^^^^^^^^ 這應該看你的HDD多快, 和資料量有大來決定吧! I/O都還沒存完 你又要再存! 存取的時間是差不多的, 會有一個時間差! 所以當你 的Timer很快時, 自己要作一些預防動作, 不然一直操HDD, IO Access 不會像Access Memory那麼快吧?
74205
一般會員


發表:8
回覆:16
積分:4
註冊:2002-10-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-11-15 19:09:30 IP:163.28.xxx.xxx 未訂閱
引言: 會不會自動garbage collection? ^^^^^^^^^^^^^^^^^^^^ 不太懂你的意思耶, 要不要說清楚一點? 這樣正在螢幕前的高手能更快的給 你解答!
我的意思是執行完的執行緒,它的記憶體空間會不會自動被free掉(BCB中) 先謝過了
lcsboy
版主


發表:87
回覆:622
積分:394
註冊:2002-06-18

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-11-15 19:40:44 IP:210.85.xxx.xxx 未訂閱
一樣的原則! 自己new出來的東東 就自己delete, 其他的BCB會幫你作! 如果不會...........那BCB不就爛到谷底啦? ^______________^
jazz
初階會員


發表:10
回覆:43
積分:35
註冊:2002-06-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-11-16 08:16:47 IP:61.30.xxx.xxx 未訂閱
將執行緒屬性設為true,在建構式裡 FreeOnTerminate = true; 另外在你要殺掉執行緒的地方加入 if (YourThread) YourThread->Terminate(); 執行緒應該會做完才離開啊,應該不會有你說的狀況啊 你是怎麼用timer去觸發執行緒啊?
dllee
站務副站長


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-11-17 14:37:50 IP:203.204.xxx.xxx 未訂閱
引言: 將執行緒屬性設為true,在建構式裡 FreeOnTerminate = true; 另外在你要殺掉執行緒的地方加入 if (YourThread) YourThread->Terminate(); 執行緒應該會做完才離開啊,應該不會有你說的狀況啊 你是怎麼用timer去觸發執行緒啊?
對於執行緒,說真的,我可以說是完全不了 < > 不過對相關的議題還是很有興趣 < > 在寫程式時,我一直秉持自己 new 出來的要自己 delete 的原則,但遇到執行緒可就有點沒輒了,因為我發現一些有執行緒的原始碼中都只有 new 而沒有 delete (我指的是有 new 出執行緒,但不用 delete 去刪掉它),當然都有 Terminate() 就是了。 我對 jazz 的話「執行緒應該會做完才離開」很感興趣,這是否表示當程式都已經要結束了,這個執行緒還有可能在執行,所以不能用 delete 只能用 Terminate() 通知執行緒該結束了。 是這樣嗎? 而程式是否由記憶體中去除是由系統決定,而非程式決定嗎? 例如:我叫用一個 DLL 內有另開執行緒,當我已 FreeLibrary() 時,如果該 DLL 的執行緒還在執行,是否系統會自動等到執行緒結束才自記憶體中移除此 DLL 呢? 沒空更新的網頁...
C及指標教學,計算機概論,資訊管理導論... http://coolsite.to/dllee 介紹Shells,LiteStep,GeoShell.... http://coolsite.to/ushells
------
http://www.ViewMove.com
jazz
初階會員


發表:10
回覆:43
積分:35
註冊:2002-06-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2002-11-17 21:09:00 IP:219.81.xxx.xxx 未訂閱
我想了很久考慮要怎麼回覆這篇 如果我的觀念有錯誤,還請指教 我之所以會說[執行緒應該會跑完才離開],是有前提的 要看生成他的父母是否還在,如果連生成執行緒的主程式都已經 被關閉了,當然如果執行緒的事件還沒有做完,也不會再繼續作了 所以可想而知,記憶體的釋放應該是由程式控制的 所以理論上如果自己生成的物件,要自己釋放 例如TThread *test = new TThread(false); 釋放時delete test; 但是如果你採用上面那種方式將FreeOnTerminate屬性設為true 那就不需要自己釋放記憶體 但是如果你的程式忘了自己釋放,其實好像也不會怎麼樣 因為當你的程式要關閉的時候,自然系統會將有關這支程式所佔的記憶體都釋放 只不過程式比較不強健罷了 再者要澄清一個觀念,就是執行緒使用的時機 依我看原發問作者應該只有使用一支執行緒 然後用Timer去觸發執行緒那段程式run或是不run 如此一來跟把要執行的程式寫在Timer裡有什麼不一樣 所以我才發問他是怎麼去用timer去觸發執行緒的 執行緒的使用時機應該是你的程式需要有多工的場合 當然我指的是你自己這支程式處理的事件要多工 而不是window系統的多工,window的多工他自己會作 例如你很有可能有同時處理大量的運算,又不希望程式畫面 因為大量的運算(可能是while迴圈或for迴圈等),而使UI動作有所延遲 只時你可能就要用執行緒了 所以理論上他應該要每次要存檔時,要new一支執行緒去作,做完自己Ternimate自己,如此一來就可以確保程式每次都應該要執行完 只不過我不知道存檔的動作,會不會有互相衝突的情形,如果有可能要用 CriticalSection保護起來 不過這裡還是有一個迷思,不要以為執行緒是神,執行緒雖然會自己分配使用 CPU的時間,但是CPU的時間只有一個,所以一般執行緒程式的寫作為了程式的 執行效率,還是會在系統限制可以生成的執行緒數目,超過就不再生成 所以問題回來了,假如原作者的存檔動作需要40msec,那他就真的需要 40msec來作存檔,即使他使用執行緒也沒有救,使用多個執行緒來完成 只不過讓他的程式多工的去作存檔的動作(不知道會不會有問題) 並沒有使他的存檔動作加快,所以我才說這樣跟把存檔的程式放在Timer裡 有什麼不一樣 所以應該問原發問作者,他的存檔動作需要用執行緒來作嗎? 應該思考的是使用執行緒的時機吧 小弟個人見解,請多包涵
74205
一般會員


發表:8
回覆:16
積分:4
註冊:2002-10-23

發送簡訊給我
#8 引用回覆 回覆 發表時間:2002-11-18 19:25:54 IP:163.28.xxx.xxx 未訂閱
因為我要在一段傳進來的資料流中 每過一段固定時間去擷取一段資訊 想當然爾就用timer去做 不過處理資訊然後又存檔的時間會拖累timer 所以我打算每次timer發生後就產生一條執行緒 讓timer盡量保持正確,之後的處理動作則各自完成 不過因為執行緒的大量產生 所以我很注意完成的執行緒是否會自行清除
jazz
初階會員


發表:10
回覆:43
積分:35
註冊:2002-06-15

發送簡訊給我
#9 引用回覆 回覆 發表時間:2002-11-18 22:50:21 IP:61.30.xxx.xxx 未訂閱
那提供你另一個方法 你還是保持用Timer來觸發事件 先把資料流接收起來 然後將每一筆資料流都塞給TList 這樣背景只要一個執行緒慢慢作 一直在處理這個TList 負責資料處理及存檔就行了
74205
一般會員


發表:8
回覆:16
積分:4
註冊:2002-10-23

發送簡訊給我
#10 引用回覆 回覆 發表時間:2002-11-19 01:30:53 IP:163.28.xxx.xxx 未訂閱
引言: 那提供你另一個方法 你還是保持用Timer來觸發事件 先把資料流接收起來 然後將每一筆資料流都塞給TList 這樣背景只要一個執行緒慢慢作 一直在處理這個TList 負責資料處理及存檔就行了
我了解你的意思了,謝謝.
系統時間:2024-04-26 4:24:49
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!