請問可以把VCL元件放到Thread裡面嗎? |
尚未結案
|
melticemelt
一般會員 發表:22 回覆:29 積分:10 註冊:2002-10-01 發送簡訊給我 |
|
Zard
尊榮會員 發表:24 回覆:396 積分:539 註冊:2003-11-26 發送簡訊給我 |
引言: 我對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 發送簡訊給我 |
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 發送簡訊給我 |
可是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 發送簡訊給我 |
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 發送簡訊給我 |
看了你的寫法, 想把只有 Event 的部份放到 Thread 內, 這樣做實在是很危險. 小弟在此建議一下,
把該"問題VCL"從建造到摧毀都作在 Thread->Execute() 內, 連帶所有的Event 有都作在該 Thread 內, 然後當你有需要取得VCL資料時的時候, 再用 Synchronize 同步資料即可. ==================================================
Howard Chen.
Delphi, Java 我的神.....
.NET 垃圾筒在哪裡?...
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |