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

請問可以把VCL元件放到Thread裡面嗎?

尚未結案
melticemelt
一般會員


發表:22
回覆:29
積分:10
註冊:2002-10-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-01 18:22:26 IP:203.69.xxx.xxx 未訂閱
我對Thread實在不熟,只知道可以用while(!Terminated)把程式寫在裡面就可以跟MainThread完全分離,可是要怎麼把VCL元件放到Thread裡面呢?VCL元件需要大量的運算時間而hang住GUI,要如何把整個元件及event handler放到Thread內而且完全不會影響到MainThread的執行呢?
Zard
尊榮會員


發表:24
回覆:396
積分:539
註冊:2003-11-26

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-01 21:18:35 IP:61.64.xxx.xxx 未訂閱
引言: 我對Thread實在不熟,只知道可以用while(!Terminated)把程式寫在裡面就可以跟MainThread完全分離,可是要怎麼把VCL元件放到Thread裡面呢?VCL元件需要大量的運算時間而hang住GUI,要如何把整個元件及event handler放到Thread內而且完全不會影響到MainThread的執行呢?
不用把VCL放到Thread裡啊~ 只要在Thread的while loop裡加上 Application->ProcessMessage(), 就可以讓UI不被咬住了.
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-11-02 02:02:43 IP:211.76.xxx.xxx 未訂閱
melticemelt你好: TThread物件中有個Synchronize的函式,是可以被動的讓主Thread的VCL元件執行的方法。可以參考一些站上之前Thread的討論。 另外在TThread Execute函式裡是不能放入Application->ProcessMessage()的,那會打亂Main Thread。不過我想Zard版友的意思應該是在Main Thread中的loop裡加入ProcessMessage吧...讓UI活起來,這應該也是比較適合的解法。因為大部份的VCL元件都需要處理Message,因此需要和Main Thread有很深的關係,不適合放在TThread中。 如果你目標的VCL元件確定不需要Message的相關處理,可以試著放到TThread的架構中。或者在MainThread運算中加上ProcessMessage即可。 發表人 - pwipwi 於 2004/11/02 02:04:21
melticemelt
一般會員


發表:22
回覆:29
積分:10
註冊:2002-10-01

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-11-02 09:22:36 IP:203.69.xxx.xxx 未訂閱
可是Synchronize()不就是切回MainThread執行嗎?我試過在Thread內call Sleep(),用Synchronize()則MainForm動也不動,直接call Sleep()則一切運作正常。所以我才想問說能不能把VCL元件和MainThread切開,就是完全不影響MainThread執行,我想應該不行吧? 我目前有用一個activex元件,他本身有可能一秒觸發幾百個事件,元件自己本身也不太穩,我在event handler內加入Application->ProcessMessage()結果完全不能跑,出現什麼variant lock的錯誤。所以才想說把元件移到Thread執行看看會不會比較穩。
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-11-02 18:32:35 IP:211.76.xxx.xxx 未訂閱
1.Synchronize()不就是切回MainThread嗎? 嚴格來說,不是。他的作用是把目前的Thread暫停,然後在MainThread裡執行目標函式。當函式結束後,原來的Thread才又開始運作。Thread和Thread間,是井水不犯河水的...(我一段時間沒寫Thread程式了,有錯誤煩請版上大大們指正。) 基本上,一個程式就是一個Process,一個Process裡可以有很多個Thread。而其中只有一個Thread是負責處理Message。如果你的ActiveX元件有運用到Message來驅動,就很難放在其他的Thread裡面。不然就是要把元件中MainThread和TThread的執行部份切分得很清楚,之間用Thread safe的變數來控制。 不過我想應該有更好的解決方法,或許版上的大大們可以提供~
powerhowardchen
初階會員


發表:15
回覆:28
積分:28
註冊:2004-04-19

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-11-22 22:50:27 IP:61.70.xxx.xxx 未訂閱
看了你的寫法, 想把只有 Event 的部份放到 Thread 內, 這樣做實在是很危險. 小弟在此建議一下, 把該"問題VCL"從建造到摧毀都作在 Thread->Execute() 內, 連帶所有的Event 有都作在該 Thread 內, 然後當你有需要取得VCL資料時的時候, 再用 Synchronize 同步資料即可. ================================================== Howard Chen. Delphi, Java 我的神..... .NET 垃圾筒在哪裡?...
系統時間:2024-08-10 18:32:43
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!