Critical Section和Synchronize |
尚未結案
|
uesugi46
一般會員 發表:7 回覆:14 積分:4 註冊:2003-09-03 發送簡訊給我 |
|
ENIX007
高階會員 發表:28 回覆:274 積分:185 註冊:2003-11-27 發送簡訊給我 |
uesugi46您好
從BCB的File|New開一個Thread Object,會出現以下註解
引言:明白表示VCL的物件必須使用Synchronize來確保多緒執行安全性 但在Synchronize說明檔中又有這一行//--------------------------------------------------------------------------- // 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"; // } //--------------------------------------------------------------------------- 引言: 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 發送簡訊給我 |
|
uesugi46
一般會員 發表:7 回覆:14 積分:4 註冊:2003-09-03 發送簡訊給我 |
|
ENIX007
高階會員 發表:28 回覆:274 積分:185 註冊:2003-11-27 發送簡訊給我 |
|
frankiech
中階會員 發表:7 回覆:78 積分:52 註冊:2002-08-29 發送簡訊給我 |
|
uesugi46
一般會員 發表:7 回覆:14 積分:4 註冊:2003-09-03 發送簡訊給我 |
|
frankiech
中階會員 發表:7 回覆:78 積分:52 註冊:2002-08-29 發送簡訊給我 |
|
ENIX007
高階會員 發表:28 回覆:274 積分:185 註冊:2003-11-27 發送簡訊給我 |
|
frankiech
中階會員 發表:7 回覆:78 積分:52 註冊:2002-08-29 發送簡訊給我 |
引言: 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 發送簡訊給我 |
引言: 這是因為 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 發送簡訊給我 |
引言: 恩...不見得喔,如果真的要操作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 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |