DLL中可否建置Thread ??? |
答題得分者是:syntax
|
AJ
一般會員 發表:9 回覆:19 積分:20 註冊:2003-06-27 發送簡訊給我 |
|
syntax
尊榮會員 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
thread 的停止,只要檢查停止條件到達後,就會停止,即使你呼叫停止含式,也只不過是將停止條件設成 True 而已,並不會真的使 thread 停止,你必需加入檢查停止條件的程式碼來停止你的 thread,不然永遠不會停直到運作自然結束,另外用於 Dll 中並無太大不同,所以照用即可.
TThread.Terminate 只有一個動作 --> 將 FTerminated 設成 True 後就返回了,跟 TThread.Terminated := True 作用一樣,所以 thread 還是不會停,要在 TThread.Execute 內加入檢查來停止
可加入
if terminated then break; 來達成
引言: 各位大大: 小弟有一問題請教,就是dll中是否可以建置Thread?若可以,又該如何實行? 我償試去做,雖可以正確編譯,但是ap呼叫dll中的函式啟動thread後,無法呼叫停止thread的函式,THREAD除ㄌ達到停止條件外,可否用函式中止? 可能是我對dll的觀念不熟,還望大大們不吝指教,該如何在dll中使用thread呢? 發表人 - AJ 於 2003/07/01 11:16:25 |
ha0009
版主 發表:16 回覆:507 積分:639 註冊:2002-03-16 發送簡訊給我 |
|
AJ
一般會員 發表:9 回覆:19 積分:20 註冊:2003-06-27 發送簡訊給我 |
謝謝syntax大大
我又有個疑問,當我呼叫DLL中之Thread後,卻卡死回不了ap,我不曉得問題是出在哪裡,
我列出部分程式碼: ==============DLL=============
//thread型態類別
... type TLineScan = class(TThread) private procedure Scan; protected procedure Execute; override; public Constructor Create; end; //宣告函式供外部呼叫 function StartThread(var1:integer;var var2,var3:integer):integer; stdcall; function StopThread(var1: integer): integer;stdcall; var autoscan:TLineScan;//宣告thread implementation //函式內容 function StartThread(var1:integer;var var2,var3:integer):integer; begin ... autoscan:=TLineScan.create; ... end; function StopThread(var1: integer): integer; begin ... autoscan.Terminate; ... end; //thread函式 Constructor TLineScan.Create; begin inherited Create(False); FreeOnTerminate := True; end; procedure TLineScan.Execute; begin While not Terminated do BEGIN synchronize(Scan); END; end; procedure TLineScan.Scan; begin ... end; ========== AP ================ ... implementation procedure Tmainform.Button1Click(Sender: TObject); //呼叫啟動dll中的thread type Ttestdll= function (var1:integer;var var2,var3:integer):integer; var h:THandle; testdll : Ttestdll; ... begin ... h:=loadlibrary(PCHAR('dll.dll')); //loading dll file if h=0 then begin Application.MessageBox('無法載入DLL檔','Error',MB_DEFBUTTON1); exit; end else begin @testdll := GetProcAddress(h, pchar('StartThread')); if @testdll = nil then begin Application.MessageBox('無法呼叫DLL函數','Error',MB_DEFBUTTON1); exit; end else begin return_code:= testdll(set,max,ap); end; end; ... end; procedure Tmainform.Button2Click(Sender: TObject); //呼叫停止dll中的thread type Ttestdll= function(var1:integer):integer; var h:THandle; testdll : Ttestdll; ... begin ... h:=loadlibrary(PCHAR('dll.dll')); //loading dll file if h=0 then begin Application.MessageBox('無法載入DLL檔','Error',MB_DEFBUTTON1); exit; end else begin @testdll := GetProcAddress(h, pchar('Stopthread')); if @testdll = nil then begin Application.MessageBox('無法呼叫DLL函數','Error',MB_DEFBUTTON1); exit; end else begin return_code:= testdll(ap); end; end; FreeLibrary(h); ... end;以上列出與dll及thread相關之程式碼,無關的都全省略, 我要按下按鈕啟動dll之thread,按下停止鈕,停止thread 但是卻在啟動thread後,卡死回不了ap,使得我無法在ap中止 thread..... 小弟初學delphi,有很多不懂,望大大們提攜~^^ |
ha0009
版主 發表:16 回覆:507 積分:639 註冊:2002-03-16 發送簡訊給我 |
|
AJ
一般會員 發表:9 回覆:19 積分:20 註冊:2003-06-27 發送簡訊給我 |
引言: 你好: 你的問題有可能是卡在 synchronize(Scan);這段,因為你沒有列出裡面的程式碼,所以我只能猜測程式因為某種原因一直在 Scan 中執行。謝謝ha0009大大的提示,之前不知道dll中如何debug,使我懷疑是thread的問題 爬文找到在dll中設中斷點方法後,找到問題確實出在scan函式中,謝謝大大們的幫忙^^ 引言: 順便一提,你的 h 不該設在 程序中,因為你要靠 h 釋放資源。所以當你要釋放時只要判斷 h 是否有值既可,不需再呼叫取得一次 DLL 的 Handle。 >>< face="Verdana, Arial, Helvetica"> 又學到了一個觀念,謝謝ha0009~ 小弟程式寫作經驗不足,希望大大們不吝指導小弟我~ |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |