線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2055
推到 Plurk!
推到 Facebook!

DLL中可否建置Thread ???

答題得分者是:syntax
AJ
一般會員


發表:9
回覆:19
積分:20
註冊:2003-06-27

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-07-01 11:01:47 IP:211.21.xxx.xxx 未訂閱
各位大大: 小弟有一問題請教,就是dll中是否可以建置Thread?若可以,又該如何實行? 我償試去做,雖可以正確編譯,但是ap呼叫dll中的函式啟動thread後,無法呼叫停止thread的函式,THREAD除ㄌ達到停止條件外,可否用函式中止? 可能是我對dll的觀念不熟,還望大大們不吝指教,該如何在dll中使用thread呢? 發表人 - AJ 於 2003/07/01 11:16:25
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-07-01 13:22:51 IP:61.70.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-07-02 07:51:06 IP:61.56.xxx.xxx 未訂閱
你好: 就像 syntax 說的一樣,你是否方便將有問題的 Source Post 到 會員求助程式檔案上傳區讓大家幫你看看問題在哪呢
AJ
一般會員


發表:9
回覆:19
積分:20
註冊:2003-06-27

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-07-02 10:19:03 IP:211.21.xxx.xxx 未訂閱
謝謝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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-07-02 10:29:25 IP:61.30.xxx.xxx 未訂閱
你好: 你的問題有可能是卡在 synchronize(Scan);這段,因為你沒有列出裡面的程式碼,所以我只能猜測程式因為某種原因一直在 Scan 中執行。 順便一提,你的 h 不該設在 程序中,因為你要靠 h 釋放資源。所以當你要釋放時只要判斷 h 是否有值既可,不需再呼叫取得一次 DLL 的 Handle。
AJ
一般會員


發表:9
回覆:19
積分:20
註冊:2003-06-27

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-07-04 08:54:27 IP:211.21.xxx.xxx 未訂閱
引言: 你好: 你的問題有可能是卡在 synchronize(Scan);這段,因為你沒有列出裡面的程式碼,所以我只能猜測程式因為某種原因一直在 Scan 中執行。
謝謝ha0009大大的提示,之前不知道dll中如何debug,使我懷疑是thread的問題 爬文找到在dll中設中斷點方法後,找到問題確實出在scan函式中,謝謝大大們的幫忙^^
引言: 順便一提,你的 h 不該設在 程序中,因為你要靠 h 釋放資源。所以當你要釋放時只要判斷 h 是否有值既可,不需再呼叫取得一次 DLL 的 Handle。 < face="Verdana, Arial, Helvetica"> 又學到了一個觀念,謝謝ha0009~ 小弟程式寫作經驗不足,希望大大們不吝指導小弟我~
系統時間:2024-04-27 10:16:57
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!