TCriticalSection 的問題 |
答題得分者是:aftcast
|
salo0610
高階會員 發表:42 回覆:120 積分:107 註冊:2003-02-18 發送簡訊給我 |
|
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
建議可以至qcom下載我曾開的multithread的課程範例與講義。還有我的部落格關於thread-safe的文章。
在此,我還是舉一下例子: 假設在某速食店裡除了漢寶等外,還有提供多種果汁,但該果汁機雖可製做各種口味,但因只有一個流出口,所以正常來說要處理完一種果汁才能換再做另一種。 情境: 假設現在有四個服務人員在櫃檯,且有很多的客人點餐。 1/ 假設若人員「無視」果汁機是否已在製作中,每個服務人員照自己的單子就開始案客人點的口味,那麼會如何? 很可能拿給客人的果汁是綜合的 ^^ ,比如點apple juice,結果半途有人再按一次oringe口味,於是那杯就變成二種綜合的口味了。 於是,有人想了一個辦法,就是在果汁機上放個牌子,當製作前就放上去,牌子寫「製作中請不要再動機器」,於是你沒有任何人會再同時來按這台機器,是只痴痴的等候牌子拿下來… 以上的牌子,就是你用的critical section的做法!! 很好! ,然而… 你的問題是…張三已經放上牌子,但是他自己卻不處理「裝冰塊,按果汁鈕,等候流完」就跑去 **再接客人** 那麼會如何? 當然準備好這第二個客人的漢寶後,又***再度*** 去果汁機那要製作果汁,但面對機上有放牌子…於是就等起來…於是就等到天荒地老。 appliation->processmessage 就是上述的「不往下處理事又偷跑的行為」。於是若萬一接到客人再點到果汁,那不就又"重入"了,而且還會死結喔! 不知這樣是否有了解?? 至於 processmessage是否不能放在那criticalsection裡? 當然不全然是,要看你怎麼設計的。以上面的例子來說,若放牌子的那個人是「偷跑去上廁所就回來,完全不接客人」,那麼就不會有問題。重點就在message裡是否又是「接單」的工作… 結論: 是logical上的問題,不是語法上的問題!! 希望有幫助到! ===================引 用 salo0610 文 章=================== 各位好!! 請問一下, TCriticalSection->Enter(); 與 TCriticalSection->Leave(); 之間有什麼語法是禁止的嗎?? 例如: TCriticalSection->Enter(); // 保護住 { Application->ProcessMessages(); <---這能放在裡面嗎?? } TCriticalSection->Leave(); // 釋放 有什麼要注意的嗎? 為何我的程式會重入??
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan
編輯記錄
aftcast 重新編輯於 2013-01-09 23:36:12, 註解 無‧
|
salo0610
高階會員 發表:42 回覆:120 積分:107 註冊:2003-02-18 發送簡訊給我 |
|
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
嗯,沒錯!
processmessage的行為在windows程式裡就是「讓權」的觀念。我演說上也有提到。 暫時把執行緒讓出來不往下走而去接新的message,然後做別的事 (讓出執行下去的權交給os再去跑另一個(也可能是同一個) message handler) processmessage要很小心的用。一般來說,不會用在多執行緒上,而是用在單一執行緒(即一般程式裡),為了表現出「假多工」,而在一個方法(函式)裡跑出來處理一下「畫面的更新」等…但,經常的若沒配合控制機制,就常會"出事"。比如說某個button按下去就開始做一個很長的工作,而此程式又是單工的,那畫面就像死了。於是你可以用processmessage來改善,但負作用也出來。什麼呢? 就是你若沒把那個button disable的話,很可能user"手賤"多按好幾下…那你就重入n次了… 所以,不知您的問題是否有解決了呢? ^_^ ===================引 用 salo0610 文 章=================== appliation->processmessage 的感覺好像是來破壞規則的!!
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
salo0610
高階會員 發表:42 回覆:120 積分:107 註冊:2003-02-18 發送簡訊給我 |
解決了!! aftcast 謝謝你 拿掉 appliation->processmessage 就好了!! 覺得 TCriticalSection->Enter(); 沒有真正的在保護著, 果汁機上的牌子還沒被拿掉居然可以讓別人來按選擇口味的按鍵, 而 appliation->processmessage 好像是偷拿掉牌子的人。 ===================引 用 aftcast 文 章=================== 嗯,沒錯! processmessage的行為在windows程式裡就是「讓權」的觀念。我演說上也有提到。 暫時把執行緒讓出來不往下走而去接新的message,然後做別的事 (讓出執行下去的權交給os再去跑另一個(也可能是同一個) message handler) processmessage要很小心的用。一般來說,不會用在多執行緒上,而是用在單一執行緒(即一般程式裡),為了表現出「假多工」,而在一個方法(函式)裡跑出來處理一下「畫面的更新」等…但,經常的若沒配合控制機制,就常會"出事"。比如說某個button按下去就開始做一個很長的工作,而此程式又是單工的,那畫面就像死了。於是你可以用processmessage來改善,但負作用也出來。什麼呢? 就是你若沒把那個button disable的話,很可能user"手賤"多按好幾下…那你就重入n次了… 所以,不知您的問題是否有解決了呢? ^_^ ===================引 用 salo0610 文 章=================== appliation->processmessage 的感覺好像是來破壞規則的!!
編輯記錄
salo0610 重新編輯於 2013-01-10 17:17:54, 註解 無‧
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |