發出Thread後的控制權 |
尚未結案
|
blue
中階會員 發表:170 回覆:136 積分:81 註冊:2002-04-15 發送簡訊給我 |
Hi,各位先進大家好:
請教在發出Thread後的控制權移轉到那裡? 以下的程式在Thread結束後,將該Thread的資源Free,程式即Hang up, 該如何取回控制權? 謝謝! unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, Buttons, ToolWin; type TForm1 = class; TImgProce = class(TThread) protected FOwner: TForm1; FReturn: Integer; procedure Execute; override; public constructor Create(AOwner: TForm1; AGImageX: TGImageXCtrl); end; TForm1 = class(TForm) btn1: TButton; btn2: TButton; procedure btn1Click(Sender: TObject); private procedure DO_ON_THREAD_TERMINATE(Sender: TObject); public end; var Form1: TForm1; implementation {$R *.dfm} { TImgProce } constructor TImgProce.Create(AOwner: TForm1); begin inherited Create(True); FreeOnTerminate := False; FOwner := AOwner; Resume; end; procedure TImgProce.Execute; begin FReturn := 0; Terminate; end; procedure TForm1.btn1Click(Sender: TObject); begin with TImgProce.Create(Self) do begin OnTerminate := DO_ON_THREAD_TERMINATE; end; end; procedure TForm1.DO_ON_THREAD_TERMINATE(Sender: TObject); var AThread: TImgProce; begin if Assigned(Sender) and (Sender is TImgProce) then begin AThread := TImgProce(Sender); if AThread.FReturn = 0 then begin MessageDlg('Process success!', mtError, [mbYes], 0); end else begin MessageDlg('Process fail!', mtError, [mbYes], 0); end; AThread.Free; end; end; end. |
只差一步
一般會員 發表:3 回覆:8 積分:7 註冊:2006-12-14 發送簡訊給我 |
不明白你为何这样使用线程?
1、在使用线程时根本不存在控制权转移的问题。否则使用线程的意义何在? 2、在使用线程对象时请关注 { Important: Methods and properties of objects in visual components can only be used in a method called using Synchronize, for example, Synchronize(UpdateCaption); and UpdateCaption could look like, procedure a.UpdateCaption; begin Form1.Caption := 'Updated in a thread'; end; } ===================引 用 blue 文 章=================== Hi,各位先進大家好: 請教在發出Thread後的控制權移轉到那裡? 以下的程式在Thread結束後,將該Thread的資源Free,程式即Hang up, 該如何取回控制權? 謝謝! unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, Buttons, ToolWin; type TForm1 = class; TImgProce = class(TThread) protected FOwner: TForm1; FReturn: Integer; procedure Execute; override; public constructor Create(AOwner: TForm1; AGImageX: TGImageXCtrl); end; TForm1 = class(TForm) btn1: TButton; btn2: TButton; procedure btn1Click(Sender: TObject); private procedure DO_ON_THREAD_TERMINATE(Sender: TObject); public end; var Form1: TForm1; implementation {$R *.dfm} { TImgProce } constructor TImgProce.Create(AOwner: TForm1); begin inherited Create(True); FreeOnTerminate := False; FOwner := AOwner; Resume; end; procedure TImgProce.Execute; begin FReturn := 0; Terminate; end; procedure TForm1.btn1Click(Sender: TObject); begin with TImgProce.Create(Self) do begin OnTerminate := DO_ON_THREAD_TERMINATE; end; end; procedure TForm1.DO_ON_THREAD_TERMINATE(Sender: TObject); var AThread: TImgProce; begin if Assigned(Sender) and (Sender is TImgProce) then begin AThread := TImgProce(Sender); if AThread.FReturn = 0 then begin MessageDlg('Process success!', mtError, [mbYes], 0); end else begin MessageDlg('Process fail!', mtError, [mbYes], 0); end; AThread.Free; end; end; end. |
blue
中階會員 發表:170 回覆:136 積分:81 註冊:2002-04-15 發送簡訊給我 |
Hi,您好:
1.之所以使用線程,是因為原先的物件(TImgProce.Execute內的東東)在使用時會造成其他控件停止回應(灴是停止,而是需等很久,例如TAnimate, Button等),因此另外起一線程去處理 2. 若該線程結束後的 AThread.Free 不執行就不會Hang up,但該線程的資源就會佔用了, 3.小弟也認同如先進所言線程不存在控制權移轉的問題,但,最終卻是Hang up,主要的Form上任何應可取得焦點的控件完全無作用 謝謝! ===================引 用 只差一步 文 章=================== 不明白你为何这样使用线程? 1、在使用线程时根本不存在控制权转移的问题。否则使用线程的意义何在? 2、在使用线程对象时请关注 { Important: Methods and properties of objects in visual components can only be used in a method called using Synchronize, for example, Synchronize(UpdateCaption); and UpdateCaption could look like, procedure a.UpdateCaption; begin Form1.Caption := 'Updated in a thread'; end; } ===================引 用 blue 文 章=================== Hi,各位先進大家好: 請教在發出Thread後的控制權移轉到那裡? 以下的程式在Thread結束後,將該Thread的資源Free,程式即Hang up, 該如何取回控制權? 謝謝! unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, Buttons, ToolWin; type TForm1 = class; TImgProce = class(TThread) protected FOwner: TForm1; FReturn: Integer; procedure Execute; override; public constructor Create(AOwner: TForm1; AGImageX: TGImageXCtrl); end; TForm1 = class(TForm) btn1: TButton; btn2: TButton; procedure btn1Click(Sender: TObject); private procedure DO_ON_THREAD_TERMINATE(Sender: TObject); public end; var Form1: TForm1; implementation {$R *.dfm} { TImgProce } constructor TImgProce.Create(AOwner: TForm1); begin inherited Create(True); FreeOnTerminate := False; FOwner := AOwner; Resume; end; procedure TImgProce.Execute; begin FReturn := 0; Terminate; end; procedure TForm1.btn1Click(Sender: TObject); begin with TImgProce.Create(Self) do begin OnTerminate := DO_ON_THREAD_TERMINATE; end; end; procedure TForm1.DO_ON_THREAD_TERMINATE(Sender: TObject); var AThread: TImgProce; begin if Assigned(Sender) and (Sender is TImgProce) then begin AThread := TImgProce(Sender); if AThread.FReturn = 0 then begin MessageDlg('Process success!', mtError, [mbYes], 0); end else begin MessageDlg('Process fail!', mtError, [mbYes], 0); end; AThread.Free; end; end; end. |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |