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

Critical Section和Synchronize

尚未結案
uesugi46
一般會員


發表:7
回覆:14
積分:4
註冊:2003-09-03

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-01-06 17:37:21 IP:61.221.xxx.xxx 未訂閱
請問大大.. Critical Section和Synchronize功能是一樣的嗎..?
ENIX007
高階會員


發表:28
回覆:274
積分:185
註冊:2003-11-27

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-01-07 10:26:22 IP:210.243.xxx.xxx 未訂閱
uesugi46您好 從BCB的File|New開一個Thread Object,會出現以下註解  
引言:
//---------------------------------------------------------------------------    //   Important: Methods and properties of objects in VCL can only be
//   used in a method called using Synchronize, for example:
//
//      Synchronize(UpdateCaption);
//
//   where UpdateCaption could look like:
//
//      void __fastcall Unit2::UpdateCaption()
//      {
//        Form1->Caption = "Updated in a thread";
//      }
//--------------------------------------------------------------------------- 
明白表示VCL的物件必須使用Synchronize來確保多緒執行安全性 但在Synchronize說明檔中又有這一行
引言: Note: You can also protect unsafe methods using critical sections or the multi-read exclusive-write synchronizer.
也就是說,在BCB裡,二者都是可以用的,小弟認為Synchronize只是BCB把Critical Section 包成一個函式方便使用(單純是小弟個人想法喔) 不過
------
程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
frankiech
中階會員


發表:7
回覆:78
積分:52
註冊:2002-08-29

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-01-07 13:03:52 IP:61.222.xxx.xxx 未訂閱
我記得沒錯的話 Synchronize 是切至Main Thread來執行
uesugi46
一般會員


發表:7
回覆:14
積分:4
註冊:2003-09-03

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-01-07 22:32:05 IP:218.162.xxx.xxx 未訂閱
那如果我使用一個queue,分別使用兩條執行序放入跟取出..那會不會發生問題啊...?
ENIX007
高階會員


發表:28
回覆:274
積分:185
註冊:2003-11-27

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-01-08 08:47:57 IP:210.243.xxx.xxx 未訂閱
uesugi46您好 應該是OK的,因為我也都是這麼做的 不過小弟使用的是 > 程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
------
程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
frankiech
中階會員


發表:7
回覆:78
積分:52
註冊:2002-08-29

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-01-08 08:55:27 IP:61.222.xxx.xxx 未訂閱
引言: 那如果我使用一個queue,分別使用兩條執行序放入跟取出..那會不會發生問題啊...?
如果你不用 Synchronize的話,就必須用Critical Section來保護 Resource ( Queue ),避免有多個Thread同時Access你的Queue.
uesugi46
一般會員


發表:7
回覆:14
積分:4
註冊:2003-09-03

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-01-08 23:36:59 IP:218.162.xxx.xxx 未訂閱
Critical Section我是知道可以保護queue..但我想知道Synchronize 是否也可以保護queue...!
frankiech
中階會員


發表:7
回覆:78
積分:52
註冊:2002-08-29

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-01-09 09:02:06 IP:61.222.xxx.xxx 未訂閱
引言: Critical Section我是知道可以保護queue..但我想知道Synchronize 是否也可以保護queue...!
如果你把Access Queue 的動作都用Synchronize 來保護即可.
ENIX007
高階會員


發表:28
回覆:274
積分:185
註冊:2003-11-27

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-01-09 09:48:37 IP:210.243.xxx.xxx 未訂閱
uesugi46您好 嗯..我想我找到差別之處了... 保護Queue方面,二者都是可行的,但是如果執行緒程序中有包含VCL元件 時,則只能使用Synchronize 程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
------
程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
frankiech
中階會員


發表:7
回覆:78
積分:52
註冊:2002-08-29

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-01-09 14:01:06 IP:61.222.xxx.xxx 未訂閱
引言: uesugi46您好 嗯..我想我找到差別之處了... 保護Queue方面,二者都是可行的,但是如果執行緒程序中有包含VCL元件 時,則只能使用Synchronize 程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
這是因為 VCL 不是Thread-Safe,同時有多個Thread Access 可能會有問題, 而Synchronize()是利用SendMessage 的方式由Main Thread來執行. 至於CriticalSection,我認為並非不能用在VCL,只要每個Thread Wait 的CriticalSection Object 是同一個即可. 另外就是使用CriticalSection時要注意DeadLocked的問題.
lu
高階會員


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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-01-12 17:07:00 IP:211.72.xxx.xxx 未訂閱
引言: 這是因為 VCL 不是Thread-Safe,同時有多個Thread Access 可能會有問題, 而Synchronize()是利用SendMessage 的方式由Main Thread來執行. 至於CriticalSection,我認為並非不能用在VCL,只要每個Thread Wait 的CriticalSection Object 是同一個即可. 另外就是使用CriticalSection時要注意DeadLocked的問題.
至於CriticalSection,我認為並非不能用在VCL,只要每個Thread Wait 的CriticalSection Object 是同一個即可 恩...不見得喔,如果真的要操作VCL,偶建議還是用Synchronize()比較安全,這是偶個人經驗,因為如果不行,不一定會『馬上』當機,通常是過一段時間之後,莫名其妙的當,所以建議還是用Synchronize()....反正效能上沒什麼差別......
frankiech
中階會員


發表:7
回覆:78
積分:52
註冊:2002-08-29

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-01-13 09:55:00 IP:61.222.xxx.xxx 未訂閱
引言: 恩...不見得喔,如果真的要操作VCL,偶建議還是用Synchronize()比較安全,這是偶個人經驗,因為如果不行,不一定會『馬上』當機,通常是過一段時間之後,莫名其妙的當,所以建議還是用Synchronize()....反正效能上沒什麼差別......
Sorry !! 我查了一些資料,Lu兄及ENIX007兄說的沒錯 . 因為絕大部分的VCL內部都不是Thread-Safe,尤其是有Window(依靠Message Loop來處理)及GUI的元件,如果單單只用CriticalSection 並無法保證與VCL做到 synchronized,所以只能用SendMessage的方式,統一由Main Thread來access VCL. 發表人 - frankiech 於 2004/01/13 09:56:24
系統時間:2024-11-21 18:48:36
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!