线程 拜求 高手执教 帮忙调试
代码如下:
先执行 Button2Click 然后执行 Button4Click 为什么 线程没执行函数 没有推出去 但是 执行 Button5Click 后 IsThreadTerminate 明显时 TRUE 的
拜求 高手执教 帮忙调试
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TThreadProc = Procedure(const IsThreadTerminate : boolean) of object;
TMyThread = class(TThread)
private
FIsThreadTerminate: boolean;
FThreadProc : TThreadProc;
protected
procedure Execute; Override;
public
constructor Create(ThreadProc : TThreadProc);OverLoad;
destructor destroy;override;
property IsThreadTerminate:boolean read FIsThreadTerminate write FIsThreadTerminate;
procedure TerminateThread;
end;
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Edit2: TEdit;
Button5: TButton;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
private
myThread: TMyThread;
procedure num(const IsThreadTerminate : boolean);
//procedure ONThreaddestroy;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.num(const IsThreadTerminate : boolean);
var
i,j: integer;
begin
j:= 0;
for i:= 0 to 100000 do
begin
if IsThreadTerminate then
begin
Edit2.Text:= '111111111111 ';
break;
end
else
Edit2.Text:= '2222222222222 ';
j:= j + 1;
Edit1.Text:= inttostr(j);
end;
end;
procedure TMyThread.Execute;
begin
if Assigned(FThreadProc) then FThreadProc(FIsThreadTerminate);
end;
constructor TMyThread.Create(ThreadProc : TThreadProc);
begin
FThreadProc:= ThreadProc;
FreeOnterminate := TRUE;
FIsThreadTerminate:= FALSE;
Inherited Create(FALSE);
end;
destructor TMyThread.destroy;
begin
end;
procedure TMyThread.TerminateThread;
begin
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
myThread:= TmyThread.Create(num);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
myThread.Resume;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
myThread.Suspend;
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
myThread.Suspend;
//设置IsThreadTerminate 为TRUE 让线程自动结束
myThread.IsThreadTerminate:= TRUE;
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
//测试 IsThreadTerminate 是否为TRUE
if myThread.IsThreadTerminate then
showmessage( '111 ');
end;
end.
[解决办法]
点击Button2时,线程运行并退出
Inherited Create(FALSE);
[解决办法]
IsThreadTerminate 的值发生矛盾.
[解决办法]
VCL不是线程安全的,要用同步方法。