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

Thread / Critical Section / Global Var

尚未結案
silence
一般會員


發表:9
回覆:17
積分:10
註冊:2003-06-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-02-05 11:39:56 IP:61.218.xxx.xxx 未訂閱
遭遇幾個問題想請教, 應該沒有放錯版面吧 例如: 主程式下有數個 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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-02-06 17:37:14 IP:203.222.xxx.xxx 未訂閱
如果只有在關閉時會出錯,那很簡單 就是你的 thread 還在跑,但是你的主程式關閉了,有些東係被釋放了,所以會錯
系統時間:2024-05-08 4:54:51
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!