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

關於多執行緒應用的問題

尚未結案
vittel
一般會員


發表:13
回覆:14
積分:5
註冊:2003-09-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-04-02 11:20:59 IP:210.66.xxx.xxx 未訂閱
我的程式中要對影像一直做檢測.. 而我在檢測的過程中..仍然必須一直監聽IOport各訊息.. 假如有異常我就必須停止檢測影像..或做其他處理.. 以從前學組合語言的想法..很簡單..一發生中斷.. 就立即進入中斷函式..進行處理.. 現在使用BCB..我的想法是..用兩條執行緒.. 一條負責檢測影像..一條負責監聽IO.. 可是..如果發現異常訊息的時候..我要怎麼將訊息傳給檢測影像的執行緒呢.. 我現在想到的是..除了兩條執行緒外..一定還有些公用的變數.. 比如說 bool error=false; 我在檢查影像的同時必須常常檢查這個變數.. 一但IO那條執行緒發現有錯誤就將error設為true.. 檢測影像的執行緒在檢查error時..發現error==true.. 便知道有異常需要停止.. so..這樣的做法可行嗎.. 有其他更好的方法嗎.. 因為..總覺得分出一條執行緒一直跑迴圈..好像會很影響影像檢測的速度.. 我現在正在寫程式中..因為還想不到其他做法.. 就先這樣試試看..希望大家多給我點意見吧.. 謝謝..請各位多多指教..
liangnet
中階會員


發表:19
回覆:148
積分:83
註冊:2004-01-03

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-04-02 13:10:29 IP:218.163.xxx.xxx 未訂閱
那應該會有主執行緒吧 當io port檢測出錯誤訊息時,就傳個訊息給主執行緖。 主執行緒收到錯誤後再對影像的執行緒送出結束的訊息!
vittel
一般會員


發表:13
回覆:14
積分:5
註冊:2003-09-19

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-04-02 17:40:09 IP:210.66.xxx.xxx 未訂閱
引言: 那應該會有主執行緒吧 當io port檢測出錯誤訊息時,就傳個訊息給主執行緖。 主執行緒收到錯誤後再對影像的執行緒送出結束的訊息!
....糟糕我好像越想越不懂了.... 問題應該是出在..上面說的.."就傳個訊息給主執行緖"..這句話.. 我要如何傳呢.. 我知道BCB其實將所謂的訊息迴圈包裝好了.. 那如果我要傳訊息給主執行緒..是不是要自己定義一個訊息.. 然後要求主執行緒收到這個訊息的時候做事.. 是這樣嗎.. 監看IO port的執行緒..也一定是個迴圈才有辦法一直重複檢查IO port的值 是嗎... 麻煩請各位在多多指教..
liangnet
中階會員


發表:19
回覆:148
積分:83
註冊:2004-01-03

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-04-02 18:20:20 IP:218.163.xxx.xxx 未訂閱
抱歉,剛再看清楚一次你的文章後才知道你要問是否有更好的方法。 你目前用的方法應該就是最好的方法囉! 你檢測io port需要多久時間檢查一次?? 不然以現在的電腦的速度來說都應該夠快了。 執行緒是由系統分時的方式在執行的… 發表人 - liangnet 於 2004/04/02 18:25:49 發表人 - liangnet 於 2004/04/02 18:29:20
lu
高階會員


發表:11
回覆:189
積分:195
註冊:2003-11-19

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-04-02 18:21:08 IP:210.68.xxx.xxx 未訂閱
引言: 我現在想到的是..除了兩條執行緒外..一定還有些公用的變數.. 比如說 bool error=false; 我在檢查影像的同時必須常常檢查這個變數.. 一但IO那條執行緒發現有錯誤就將error設為true.. 檢測影像的執行緒在檢查error時..發現error==true.. 便知道有異常需要停止..
還真的不知從何回答起,建議你找本 Multi Thread 的書先K一下,因為你的觀念有點....怪怪的喔...尤其是上面這段,這個想法不能說是錯,應該說,有些漏洞 推薦一本書,這是一本中譯書....偶覺得寫得還不錯 ^^ 中文書名:Win32 多緒程式設計 英文書名:Multithreading Applications in Win32 侯俊傑譯 碁峰出版
vittel
一般會員


發表:13
回覆:14
積分:5
註冊:2003-09-19

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-04-02 20:12:15 IP:210.66.xxx.xxx 未訂閱
引言:
引言: 我現在想到的是..除了兩條執行緒外..一定還有些公用的變數.. 比如說 bool error=false; 我在檢查影像的同時必須常常檢查這個變數.. 一但IO那條執行緒發現有錯誤就將error設為true.. 檢測影像的執行緒在檢查error時..發現error==true.. 便知道有異常需要停止..
還真的不知從何回答起,建議你找本 Multi Thread 的書先K一下,因為你的觀念有點....怪怪的喔...尤其是上面這段,這個想法不能說是錯,應該說,有些漏洞 推薦一本書,這是一本中譯書....偶覺得寫得還不錯 ^^ 中文書名:Win32 多緒程式設計 英文書名:Multithreading Applications in Win32 侯俊傑譯 碁峰出版
我也覺得我的觀念真的有點怪怪的....感謝您推薦的書..我會去找來努力看的 因為這程式我現在是模擬要在機器上跑的..實際是機器一邊動作.. 程式一邊取像..檢測..還要控制機器.. 所以 > 還是請各位多多指教..謝謝..
lu
高階會員


發表:11
回覆:189
積分:195
註冊:2003-11-19

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-04-14 17:12:44 IP:210.68.xxx.xxx 未訂閱
引言: 因為這程式我現在是模擬要在機器上跑的..實際是機器一邊動作.. 程式一邊取像..檢測..還要控制機器.. 所以IO port似乎..該全程監看..?..是嗎.. 這個嘛...大概迷有人,能回答你,因為這要視你的應用而定....是否需要全程監看,還是每隔一段時間看一下,還是有空的時候再看一下,完全依你的應用而定 一秒可能要做將近二十張影像的檢測.. 呵呵~~20張,這有點難喔,加油 然後IO這條執行緒是開一個迴圈..不斷的重複檢查IO port.. 說實在的,偶不太建議你這樣做喔,道理粉簡單,訊息的傳遞粉麻煩喔(不難啦,但是粉麻煩) 總覺得不太對.. 還是請各位多多指教..謝謝.. < face="Verdana, Arial, Helvetica"> 簡單一句話,Multi Thread的程式要分工粉容易,但是要合作就粉難嘍,如果寫的不好,他會在效率上懲罰你喔 舉例來說: IO這條執行緒是開一個迴圈..不斷的重複檢查IO port 上面這句話,基本上沒錯,但是如果你這樣寫的話
while (1)
  {
    ReadIOPort();
  }
一直重複讀IO PORT那CPU不是都被你拉過來了? 所以,一般來說,是隔一小段時間檢查一次,如下:
while (1)
  {
    ReadIOPort();
    Sleep(100);
  }
所以嘛~~偶的建議還是那句老話,K書吧.....不然寫Multi Thread 最悽慘的是,程式當掉,卻不知當在哪裡,或是無緣無故就...當了 偶是深受其害
kkccgg
初階會員


發表:50
回覆:54
積分:30
註冊:2002-07-28

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-04-14 23:06:43 IP:203.204.xxx.xxx 未訂閱
1. a.把這改成Timer處理可能會比跑無窮迴圈好 while (1) { ReadIOPort(); Sleep(100); } b.開一個Timer計時到時去執行多緒ReadIO 不過在Timer計時到時應先停掉Timer等所有程序執行完後在開Timer因為若timer 計時到時處理過程時間比timer時間長可能會造成timer計時到達重複執行程序 2.可以把ReadIOPort寫成另外一支執行程式,在透過DDE or 剪貼簿 or 其它資料分享方式處理 3.可以使用real time os 4.其實讀i/o,232...等設備都會浪費很多資源(尤其是win系統),一直沒有很好的方法可以處理這是做週邊整合程式的痛苦
系統時間:2024-05-18 13:08:08
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!