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

TCriticalSection 的問題

答題得分者是:aftcast
salo0610
高階會員


發表:42
回覆:120
積分:107
註冊:2003-02-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2013-01-10 11:07:16 IP:118.163.xxx.xxx 未訂閱
各位好!!

請問一下, TCriticalSection->Enter(); 與 TCriticalSection->Leave(); 之間有什麼語法是禁止的嗎??

例如:

TCriticalSection->Enter(); // 保護住
{
Application->ProcessMessages(); <---這能放在裡面嗎??
}
TCriticalSection->Leave(); // 釋放

有什麼要注意的嗎? 為何我的程式會重入??


aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2013-01-10 14:30:22 IP:115.80.xxx.xxx 訂閱
建議可以至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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2013-01-10 16:01:00 IP:118.163.xxx.xxx 未訂閱
謝謝 aftcast 的回應!!
我是參考你的 "multithread的課程範例與講義" (可能功力有限 無法完全融匯灌通)
我以為是:

(1)
飲料機上沒杯子,才可以把杯子上放機器上(TCriticalSection->Enter()),

(2) 選擇口味 按下按鍵 製做果汁

(3)
果汁滿了,拿走杯子(TCriticalSection->Leave()),
之後才可以放上其它杯子,
因此就算 張三沒在那兒等完果汁滿了(偷跑),就再去接客人,雖然又再接到客人要點果汁,

但還是遵守以上規則 ( 1-->2-->3 ), 應該不會有重入的問題啊!!!


appliation->processmessage 的感覺好像是來破壞規則的!!

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

編輯記錄
salo0610 重新編輯於 2013-01-10 01:01:37, 註解 無‧
aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2013-01-10 17:48:57 IP:175.96.xxx.xxx 訂閱
嗯,沒錯!

processmessage的行為在windows程式裡就是「讓權」的觀念。我演說上也有提到。

暫時把執行緒讓出來不往下走而去接新的message,然後做別的事 (讓出執行下去的權交給os再去跑另一個(也可能是同一個) message handler)

processmessage要很小心的用。一般來說,不會用在多執行緒上,而是用在單一執行緒(即一般程式裡),為了表現出「假多工」,而在一個方法(函式)裡跑出來處理一下「畫面的更新」等…但,經常的若沒配合控制機制,就常會"出事"。比如說某個button按下去就開始做一個很長的工作,而此程式又是單工的,那畫面就像死了。於是你可以用processmessage來改善,但負作用也出來。什麼呢? 就是你若沒把那個button disable的話,很可能user"手賤"多按好幾下…那你就重入n次了…

所以,不知您的問題是否有解決了呢? ^_^


===================引 用 salo0610 文 章===================
appliation->processmessage 的感覺好像是來破壞規則的!!

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

------



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

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


發表:42
回覆:120
積分:107
註冊:2003-02-18

發送簡訊給我
#5 引用回覆 回覆 發表時間:2013-01-11 08:15:44 IP:118.163.xxx.xxx 未訂閱
解決了!! aftcast 謝謝你
拿掉 appliation->processmessage 就好了!!


覺得 TCriticalSection->Enter(); 沒有真正的在保護著,

果汁機上的牌子還沒被拿掉居然可以讓別人來按選擇口味的按鍵,

而 appliation->processmessage 好像是偷拿掉牌子的人。

===================引 用 aftcast 文 章===================
嗯,沒錯!

processmessage的行為在windows程式裡就是「讓權」的觀念。我演說上也有提到。

暫時把執行緒讓出來不往下走而去接新的message,然後做別的事 (讓出執行下去的權交給os再去跑另一個(也可能是同一個) message handler)

processmessage要很小心的用。一般來說,不會用在多執行緒上,而是用在單一執行緒(即一般程式裡),為了表現出「假多工」,而在一個方法(函式)裡跑出來處理一下「畫面的更新」等…但,經常的若沒配合控制機制,就常會"出事"。比如說某個button按下去就開始做一個很長的工作,而此程式又是單工的,那畫面就像死了。於是你可以用processmessage來改善,但負作用也出來。什麼呢? 就是你若沒把那個button disable的話,很可能user"手賤"多按好幾下…那你就重入n次了…

所以,不知您的問題是否有解決了呢? ^_^


===================引 用 salo0610 文 章===================
appliation->processmessage 的感覺好像是來破壞規則的!!

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

編輯記錄
salo0610 重新編輯於 2013-01-10 17:17:54, 註解 無‧
系統時間:2017-10-24 2:37:08
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!