全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2056
推到 Plurk!
推到 Facebook!

Multi-Thread 架構下程式陷入困境

尚未結案
blanka
一般會員


發表:7
回覆:7
積分:2
註冊:2003-01-03

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-09-21 11:57:29 IP:210.242.xxx.xxx 未訂閱
各位前輩小弟我目前開發一個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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-09-21 14:00:36 IP:203.69.xxx.xxx 未訂閱
就算是用 CriticalSection 只要是牽扯到 VCL 元件還是要用一下 Synchronize, 因為 VCL 元件並不曉得你用了CriticalSection來避開同步的問題....
blanka
一般會員


發表:7
回覆:7
積分:2
註冊:2003-01-03

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-09-21 20:21:25 IP:61.230.xxx.xxx 未訂閱
引言: 就算是用 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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-09-21 22:31:14 IP:61.219.xxx.xxx 未訂閱
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;
系統時間:2024-07-01 5:43:31
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!