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

多線程中使用 Bmp->canvas->pixel[x][y]的問題

答題得分者是:GrandRURU
small7011
一般會員


發表:19
回覆:34
積分:10
註冊:2007-07-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2012-09-19 17:08:31 IP:211.72.xxx.xxx 訂閱
首先先說明程式動作:
將一張圖先做2值化後,在尋找圖檔中最左邊與最右邊的第一個白點座標

而我的問題是......
1.在Form上面引用class中SlopeAngle 函式做尋找動作,無論多少次都沒有問題
2.我將相同程式套用在thread中,當執行到Bmp->canvas->pixel[x][y]會出現=-1,重複測試時好時壞

請各位大大救救我,謝謝!!

------
lee
附加檔案:50598b8fc6f1a_Sample.rar
aftcast
站務副站長


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2012-09-20 23:06:39 IP:114.42.xxx.xxx 訂閱
沒看你的程式,我快速的猜想… 你可以試一下 TBitmap的lock屬性。在處理前lock,處理後釋放

===================引 用 small7011 文 章===================
首先先說明程式動作:
將一張圖先做2值化後,在尋找圖檔中最左邊與最右邊的第一個白點座標

而我的問題是......
1.在Form上面引用class中SlopeAngle 函式做尋找動作,無論多少次都沒有問題
2.我將相同程式套用在thread中,當執行到Bmp->canvas->pixel[x][y]會出現=-1,重複測試時好時壞

請各位大大救救我,謝謝!!

------


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

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2012-09-20 23:06:55 IP:111.249.xxx.xxx 訂閱
VCL元件一直到XE3為止一直都沒有做好Thread Safe這塊
所以要手動自己做「Synchronize」

建議你在
//二值化
pProcess->Threshold(Bmp,50);
//角度斜率
pProcess->SlopeAngle(Bmp,&sSlope);
這段先做做看同步處理
應該就可以解決你的問題了

===================引 用 small7011 文 章===================
首先先說明程式動作:
將一張圖先做2值化後,在尋找圖檔中最左邊與最右邊的第一個白點座標

而我的問題是......
1.在Form上面引用class中SlopeAngle 函式做尋找動作,無論多少次都沒有問題
2.我將相同程式套用在thread中,當執行到Bmp->canvas->pixel[x][y]會出現=-1,重複測試時好時壞

請各位大大救救我,謝謝!!

small7011
一般會員


發表:19
回覆:34
積分:10
註冊:2007-07-24

發送簡訊給我
#4 引用回覆 回覆 發表時間:2012-09-21 09:39:11 IP:211.72.xxx.xxx 訂閱
GrandRURU 大,我只要將SlopeAngle 做同步處理之後就可以改善我的目前問題.

另外請教一個問題,我Threshold函式裡面是採用scanline方式,而SlopeAngle函式則採用Canvas->pixel[X][Y]方式
但Bitmap是屬於VCL,理論上我應該都用要需做同步處理才正確是嗎??


===================引 用 GrandRURU 文 章===================
VCL元件一直到XE3為止一直都沒有做好Thread Safe這塊
所以要手動自己做「Synchronize」

建議你在
//二值化
pProcess->Threshold(Bmp,50);
//角度斜率
pProcess->SlopeAngle(Bmp,&sSlope);
這段先做做看同步處理
應該就可以解決你的問題了

===================引 用 small7011 文 章===================
首先先說明程式動作:
將一張圖先做2值化後,在尋找圖檔中最左邊與最右邊的第一個白點座標

而我的問題是......
1.在Form上面引用class中SlopeAngle 函式做尋找動作,無論多少次都沒有問題
2.我將相同程式套用在thread中,當執行到Bmp->canvas->pixel[x][y]會出現=-1,重複測試時好時壞

請各位大大救救我,謝謝!!

------
lee
GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2012-09-21 10:21:56 IP:59.120.xxx.xxx 訂閱
就像蕭大說的一樣,TBitmap的lock可以避免執行緒重入的問題 (標準且最正確的作法!)

不過對初學者來說Sync會相對簡單(不管它是誰、是要幹嘛,全給我滾回Main Thread去做!)

不論怎樣,VCL用在Thread上就一定要用到同步處理,至於你要用哪一種

就看你的選擇囉

===================引 用 small7011 文 章===================
GrandRURU 大,我只要將SlopeAngle 做同步處理之後就可以改善我的目前問題.

另外請教一個問題,我Threshold函式裡面是採用scanline方式,而SlopeAngle函式則採用Canvas->pixel[X][Y]方式
但Bitmap是屬於VCL,理論上我應該都用要需做同步處理才正確是嗎??
small7011
一般會員


發表:19
回覆:34
積分:10
註冊:2007-07-24

發送簡訊給我
#6 引用回覆 回覆 發表時間:2012-10-03 09:34:55 IP:211.72.xxx.xxx 訂閱


GrandRURU大,後來我使用Sync同步處理方式已經獲得解決,而蕭大說的lock方式我還在嘗試
分數我就先給GrandRURU

===================引 用 GrandRURU 文 章===================
就像蕭大說的一樣,TBitmap的lock可以避免執行緒重入的問題 (標準且最正確的作法!)

不過對初學者來說Sync會相對簡單(不管它是誰、是要幹嘛,全給我滾回Main Thread去做!)

不論怎樣,VCL用在Thread上就一定要用到同步處理,至於你要用哪一種

就看你的選擇囉

===================引 用 small7011 文 章===================
GrandRURU 大,我只要將SlopeAngle 做同步處理之後就可以改善我的目前問題.

另外請教一個問題,我Threshold函式裡面是採用scanline方式,而SlopeAngle函式則採用Canvas->pixel[X][Y]方式
但Bitmap是屬於VCL,理論上我應該都用要需做同步處理才正確是嗎??
------
lee
系統時間:2024-04-26 23:21:09
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!