線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1931
推到 Plurk!
推到 Facebook!

TThread中採用TBitmap

答題得分者是:aftcast
CoffeeX
中階會員


發表:18
回覆:121
積分:72
註冊:2005-02-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-08-12 01:00:41 IP:140.125.xxx.xxx 未訂閱

TThread中採用TBitmap似乎會有複製一個

TBitmap到另一個TBitmap的問題(Asign,CopyRect...),

(是在同一個Thread中宣告的TBitmap)

目前我是將Canvas->Lock,

情況似乎有好些,請高手釋疑...

------
=.=???
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2006-08-12 15:08:11 IP:211.22.xxx.xxx 未訂閱
建議查一下CriticalSection以及Thread的Syncronize方法。
CoffeeX
中階會員


發表:18
回覆:121
積分:72
註冊:2005-02-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2006-08-12 15:17:52 IP:140.125.xxx.xxx 未訂閱

不過我是在同一個thread class中產生的TBitmap

然後再由其中一個copy到另一個...

critical不是要讓其他thread無法讀取這個區域的記憶體?

目前還不太清楚問題的主要原因...

因為我的兩個TBitmap都在thread中new出來的,

如果跳到主執行緒上去運作感覺好像怪怪的...(Syncronize)

或是TBitmap不適合在Thread中new?
===================引 用 文 章===================
建議查一下CriticalSection以及Thread的Syncronize方法。

------
=.=???
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2006-08-13 08:59:51 IP:61.229.xxx.xxx 未訂閱

===================引 用 文 章===================

如果跳到主執行緒上去運作感覺好像怪怪的...(Syncronize)

或是TBitmap不適合在Thread中new?
===================引 用 文 章===================

TBitmap在Thread中使用算是thread-safe的! 也就是說無需用Syncronize。但雖說是safe的,你還是會使用到Main Thread裡的device context (DC) 資源,為了Main Thread 和你這個自己create的Sub Thread共用 DC資源,你就需要使用Lock的機制確保二個不"干擾",尤其當你在子緒上使用到二個mainthread的dc資源時,如同你的TBitmap的copy就是這樣子。

順帶一提,何時該用Syncronize呢?當使用VCL元件的方法、屬性等時大多都是需要用Sync的方法。但Graphic::下的如TBitmap等是無需的。因為它是thread-safe的。無需轉至main thread來執行。

再提一下一個例子: ShowMessage這個方法在thread中就不是安全的。所以通常我們在thread中會使用MessageBox來取代。但若真的要用ShowMessage呢? 請在thread中寫一個方法,如ShowMsg( ),然後加入ShowMessage("test"),然用用Synchronize(ShowMsg); 一切就正常了,只是注意,使用Sync會使效能變差,還是別用的好!乖乖的用MessageBox吧。若你直接在thread中使用ShowMessage,會抓到錯誤是因為canvas not allow drawing之類的,我曾用cpu trace過,大概是到了使用visiable時掛點,而那時候就會使用到dc資源。而大概是找不到Form下的dc handle,故出現了錯誤。當然,若它是在主緒上跑,就找得到form的dc,一切就正常了!

以上是我個人的看法,還請指教!

------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
CoffeeX
中階會員


發表:18
回覆:121
積分:72
註冊:2005-02-18

發送簡訊給我
#5 引用回覆 回覆 發表時間:2006-08-14 22:25:09 IP:140.125.xxx.xxx 未訂閱

感謝大大的指教...

我先前所寫的程式是若把bmp->assign這部份comment起來,

那麼thread就不會異常終結(沒跳出任何錯誤訊息),不過也不能確定是否和bmp拿去做後續的影像處理有關係,

但並我沒有把這張圖顯示在畫面上

後來把同個thread中有用到的bmp->canvas都Lock,感覺上就好了,

目前我把我同樣的作法教給朋友,不過還是有一定的機會會跳出錯誤(和記憶體有關),目前原因不知...

其次我想請教怎麼trace cpu,有比較好的參考資料嗎,先前一直搞不太懂跳出錯誤的那個有關cpu的視窗
===================引 用 文 章===================

TBitmap在Thread中使用算是thread-safe的! 也就是說無需用Syncronize。但雖說是safe的,你還是會使用到Main Thread裡的device context (DC) 資源,為了Main Thread 和你這個自己create的Sub Thread共用 DC資源,你就需要使用Lock的機制確保二個不"干擾",尤其當你在子緒上使用到二個mainthread的dc資源時,如同你的TBitmap的copy就是這樣子。

順帶一提,何時該用Syncronize呢?當使用VCL元件的方法、屬性等時大多都是需要用Sync的方法。但Graphic::下的如TBitmap等是無需的。因為它是thread-safe的。無需轉至main thread來執行。

再提一下一個例子: ShowMessage這個方法在thread中就不是安全的。所以通常我們在thread中會使用MessageBox來取代。但若真的要用ShowMessage呢? 請在thread中寫一個方法,如ShowMsg( ),然後加入ShowMessage("test"),然用用Synchronize(ShowMsg); 一切就正常了,只是注意,使用Sync會使效能變差,還是別用的好!乖乖的用MessageBox吧。若你直接在thread中使用ShowMessage,會抓到錯誤是因為canvas not allow drawing之類的,我曾用cpu trace過,大概是到了使用visiable時掛點,而那時候就會使用到dc資源。而大概是找不到Form下的dc handle,故出現了錯誤。當然,若它是在主緒上跑,就找得到form的dc,一切就正常了!

以上是我個人的看法,還請指教!

------
=.=???
系統時間:2024-11-23 13:21:38
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!