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

發出Thread後的控制權

尚未結案
blue
中階會員


發表:169
回覆:136
積分:81
註冊:2002-04-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-12-27 12:29:11 IP:219.81.xxx.xxx 訂閱
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-12-27 15:59:39 IP:220.196.xxx.xxx 訂閱
不明白你为何这样使用线程?
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
中階會員


發表:169
回覆:136
積分:81
註冊:2002-04-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-12-27 16:46:21 IP:219.81.xxx.xxx 訂閱
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.
系統時間:2024-04-29 7:58:43
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!