Multi-Thread 架構下程式陷入困境 |
尚未結案
|
blanka
一般會員 發表:7 回覆:7 積分:2 註冊:2003-01-03 發送簡訊給我 |
各位前輩小弟我目前開發一個Client端的程式
環境:WindowsXP Delphi7
使用元件:Indy 9.0(TIdTCPClient) kbm 1.33 QuantumGrid(dxDBGrid) TMS(DBStringGrid)
由於目前程式架構為,在收到Server的電文之後,起Multi-Thread處裡不同的訊息,各個Thread有可能同時存取同一個kbm,所以有用CriticalSection去Lock,由於QuantumGrid直接連結kbm且屬性設定為LoadAllRecord,若是使用者畫面停在該QuantumGrid就常常會出現Canvas does not allow drawing,且程式常常會莫名奇妙當掉,或是顯示資料有誤(好比說資料有十筆但是卻只顯示兩筆)請問前輩們可有什麼好建議,可以解決這一困境 吼..吼...吼....
------
吼..吼...吼.... |
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
|
blanka
一般會員 發表:7 回覆:7 積分:2 註冊:2003-01-03 發送簡訊給我 |
引言: 就算是用 CriticalSection 只要是牽扯到 VCL 元件還是要用一下 Synchronize, 因為 VCL 元件並不曉得你用了CriticalSection來避開同步的問題....底下是我Thread的原型 TWriteDBThread = class(TThread) protected procedure DisableControl; procedure EnableControl; public fDB: TkbmMemTable; constructor Create(DB: TkbmMemTable);overload; destructor Destroy;override; procedure Execute;override; procedure WriteToDB;virtual;abstract; end; procedure TWriteDBThread.Execute; begin Synchronize(DisableControl); try try WriteToDB; except end finally Synchronize(EnableControl); end; end; 我程式裡面有十幾個Thread繼承上面的Thread,並在子Thread實做WriteToDB 我舉其中依各Thread的WriteToDB來說 with fDB do begin try try for i:=0 to Count-1 do begin if Locate(...) then begin edit; end else begin append; end; ....... Post; end; except end; finally end; end; 原本的想法是對kbm下了disablecontrols在update完kbm之後再enablecontrols 這樣就可以切斷kbm跟Grid之間的互動也就不會影響UI,但實際上發現在Post的時候若是使用者畫面停在該Grid,就會看到Grid不斷在更新資料,推測是post造成的,請問前輩對此可有些建議,感激不盡 吼..吼...吼....
------
吼..吼...吼.... |
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
1. kbm 在2.xx版才提供 TkbmThreadDataset 給 thread 用, 並且提供 Lock,Unlock function 以供鎖定. 目前已到 5.01 版了... http://www.components4developers.com 2. kbm 1.33 顯然未提供完整鎖定機制 如果一定要用 只能建議以下試試看了....(如果thread 沒有做別的事, 這樣做就是變相把 thread 廢了一樣....) < class="code">
procedure TWriteDBThread.Execute;
begin
Synchronize(WriteToDB);
end; with fDB do
begin
DisableControl
try
try
for i:=0 to Count-1 do
begin
if Locate(...) then
begin
edit;
end
else
begin
append;
end;
.......
Post;
end;
except
end;
finally
EnableControl;
end;
end;
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |