在线程中使用TTimer的问题!望高人指点!(100分)

  • 主题发起人 主题发起人 windfantasy
  • 开始时间 开始时间
W

windfantasy

Unregistered / Unconfirmed
GUEST, unregistred user!
我在一个线程中试用了TTimer来显示当前时间,可是线程运行后计数器并不工作,不知道是什么原因?
unit2中部分代码如下:
type
TTimerThread = class(TThread)
……
constructor TTimerThread.Create;
begin
inherited Create(false);
FTimer:=TTimer.Create(nil);
FTimer.Interval:=300;
FTimer.OnTimer:=TimerOnTimer;
FTimer.Enabled:=true;
end;

procedure TTimerThread.Execute;
begin
{ Place thread code here }
FreeOnTerminate:=true;
end;

procedure TTimerThread.TimerOnTimer(Sender: TObject);
begin
form1.edit1.text:=timetostr(time);
end;

unit1中部分代码:
……
procedure TForm1.Button1Click(Sender: TObject);
var
TimerThread:TTimerThread;
begin
TimerThread:=TTimerThread.Create;
end;
……
我测试过,如果在form1中直接使用计数器的话倒是能够正常工作的。
哪位好心人给我指点一下,到底问题出在哪里?线程中到底是否可以用计数器?
我急用! 多谢各位指点!
 
看你程序的写法,就知道你不会有急用。
线程刚一进入就退出了。FTimer有可能还没来得及建立(不确定状态)。改为下面的样子
就没问题了。
但实在想象不出你为何要如此建立线程。
constructor TTimerThread.Create;
begin
inherited Create(True);//
FTimer:=TTimer.Create(nil);
FTimer.Interval:=300;
FTimer.OnTimer:=TimerOnTimer;
FTimer.Enabled:=true;
Resume;//
end;

 
你看看陈宽达的Delphi深度历险吧
上面有关于线程中用TTimer所出现的问题的详细说明和解决办法
 
你的线程代码一执行就Free线程了,还说什么执行了。
一般在线程中的Execute加一个大Loop,使它不会马上退出线程的运行,
而你的只有一行代码,那就马上Free线程了。当然是说的这情况了。
 
1、你的Timer不能在 TTimerThread.Create 中创建,否则你的timer消息是在父线程中处理的!
应该在execute过程中创建!
2、你的TTimerThread.Execute需要加入消息循环:
var
m:MSG;
while GetMessage(m,0,0,0)do
begin
TranslateMessage(m);
DispatchMessage(m);
end;
 
看看陈宽达的Delphi深度历险吧
 
procedure TTimerThread.Execute;
begin
{ Place thread code here }
打开FTimer.Enabled:=true;
FreeOnTerminate:=true;
end;
 
多人接受答案了。
 
后退
顶部