Win2000 下TThread为什么非要使用(Application.ProcessMessages)处理消息?(50分)

  • 主题发起人 主题发起人 yousp
  • 开始时间 开始时间
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.
 
procedure TForm1.Button1Click(Sender: TObject);
begin
FThread := TMyThread.Create(false);
FThread.Execute;
end;

FThread.Execute;
去掉
create 时如果是false,则自动调用execute
 
最好
FThread.freeonterminated:=true
这样线程结束时自动清除,否则要手动
 
看一下Application.ProcessMessages的帮助吧,写的很清楚,这句话的作用就是把
当前的控制权交给消息队列啊,然后根据消息来分配时间片,否则线程一直占有时间片,
界面当然不能处理消息了
 
但是我的程序里面没有用Application.ProcessMessages
还不是一样用!为什么呢?
 
没必要用application.processmessages,也许是你自己用个execute.
 
同上。
把FThread.Execute去掉,它是由线程自动调用的。
如果线程创建时挂起,则执行FThread.Resume;
 
是啊,Execute方法是你在主线程里调用了,
这个方法是不允许直接调用的
线程对象不是这么用的!
 
同意LiChaoHui的看法
 
FThread := TMyThread.Create(false);
[red] FThread.Execute;[/red]
错误,这样Execute方法实际上是在主线程执行的,你的程序当然没反应了.
 
sendmessage ok
 
同意xeen!
把FThread.Execute;去掉!
否则你的程序根本不是多线程。
 
多人接受答案了。
 
后退
顶部