Y
yousp
Unregistered / Unconfirmed
GUEST, unregistred user!
haoxg,您好!
自己写了一个关于Thread的测试程序,但发现了不解的问题。
我自己写了一个最简单的线程,窗体上有两个按钮,一个创建该线程,一个销毁该线程。
问题是,为什么我在线程内部非要使用Application.ProcessMessages不可,否则界面就死在那里了。
我不理解,因为自己线程是独立的程序,应该不会对程序的主线程造成影响啊。
这让人感觉Delphi的TThread不是真正意义的线程。
我这里写的线程是个空线程,里边没有任何对VCL的访问,因此也没有必要使用Synchronize。你看看是什么问题。下面是完整的代码。我的系统是Win2000.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TMyThread = class;
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
FThread: TMyThread;
public
{ Public declarations }
end;
TMyThread = class(TThread)
private
protected
public
procedure Execute;
override;
published
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TMyThread }
procedure TMyThread.Execute;
begin
while not Terminateddo
begin
//Application.ProcessMessages;
<<----- 为什么要加这句,如果不加,界面将无法处理消息
Sleep(30);
//这里已经有延时了,所以并没有占用太多CPU资源
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
FThread := TMyThread.Create(false);
FThread.Execute;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
FThread.Terminate;
FThread.Free;
end;
end.
自己写了一个关于Thread的测试程序,但发现了不解的问题。
我自己写了一个最简单的线程,窗体上有两个按钮,一个创建该线程,一个销毁该线程。
问题是,为什么我在线程内部非要使用Application.ProcessMessages不可,否则界面就死在那里了。
我不理解,因为自己线程是独立的程序,应该不会对程序的主线程造成影响啊。
这让人感觉Delphi的TThread不是真正意义的线程。
我这里写的线程是个空线程,里边没有任何对VCL的访问,因此也没有必要使用Synchronize。你看看是什么问题。下面是完整的代码。我的系统是Win2000.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TMyThread = class;
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
FThread: TMyThread;
public
{ Public declarations }
end;
TMyThread = class(TThread)
private
protected
public
procedure Execute;
override;
published
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TMyThread }
procedure TMyThread.Execute;
begin
while not Terminateddo
begin
//Application.ProcessMessages;
<<----- 为什么要加这句,如果不加,界面将无法处理消息
Sleep(30);
//这里已经有延时了,所以并没有占用太多CPU资源
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
FThread := TMyThread.Create(false);
FThread.Execute;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
FThread.Terminate;
FThread.Free;
end;
end.