Thread / Critical Section / Global Var |
尚未結案
|
silence
一般會員 發表:9 回覆:17 積分:10 註冊:2003-06-04 發送簡訊給我 |
遭遇幾個問題想請教, 應該沒有放錯版面吧 例如:
主程式下有數個 Tool 的 Thread
每個 Tool thread 再啟動數個 Port thread
由各自 Tool thread 的 [自有變數](StatusRtn)加上一個 CS 作為 record
再將 record 以 var 方式傳入 Port thread
thread 中以指標方式來使用
Port thread 會作 CS.Acquire/Release 來取得執行權
也就是說, 每個 Tool 只會同時有一個 Port 在跑
而主程式中也用同樣的方式傳 [全域變數] 到 Tool 再到 Port
每個 Tool 也都同時在執行檢查 遭遇到:
關閉主程式時, 會有 AccessViolation,
請問:
a. 這種情況是不是那一些在 Acquire Critical Section 的 Port thread 所造成的
b. 還是因為傳入上層變數(Form到Tool, Tool到Port), 而在 thread terminat 時, 上層變數先行被 free 造成的?? 部分程式示意如下
TPort = class(TLabel)
...內含新增私有變數 procedure
end;
TTool = class(TFrame)
...內含新增私有變數 procedure
end;
// 此兩者作為畫面顯示用, 而 TPort 是由 TTool 動態產生; TWIPAquireList = class(TList)
public
Lock: TCriticalSection;
end; TStatusReturn = record
myLock: TCriticalSection;
myData...
end;
... TAPort = class(TThread)
private
FPort: TPort;
FWIPAL: ^TWIPAquireList;
FSR: ^TStatusReturn;
...
end;
TATool = class(TThread)
private
FTool: TTool;
FWIPAL: ^TWIPAquireList;
FSR: ^TStatusReturn;
...
end;
// 此兩者為 Thread, 操作 TTool(Frame) & TPort(Label);
// 更新畫面時有用 Synchronize procedure TAPort.Create(Port: TPort; var SR: TStatusReturn; var WIPAL: TWIPAquireList);
begin
FPort := TPort;
FWIPAL := @WIPAL;
FSR := @SR;
FreeOnTerminate := True;
inherited Create(False);
end; constructor TATool.Create(Tool: TTool;var WIPAL: TWIPAquireList);
begin
FTool := Tool;
FWIPAL := @WIPAL;
FreeOnTerminate := True;
inherited Create(False);
end;
|
syntax
尊榮會員 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |