线程中的定时器问题(100分)

  • 主题发起人 主题发起人 happycyp
  • 开始时间 开始时间
H

happycyp

Unregistered / Unconfirmed
GUEST, unregistred user!
现在做了一个定时程序,因为一个操作比较耗时,会影响主程序反应迟钝,所以把它放到线程中运行,没想到,主程序还是受到影响,一点没有改善. 各位帮我看一下,如何改进?
代码如下:
unit UCMsgThread;
interface
uses
ExtCtrls,Classes,Forms;
type TMsgThread = class(TThread)
private
TMMsg :TTimer;
procedure TimerOnTimer(Sender: TObject);
procedure CreateTimer;
procedure DestroyTimer;
procedure RunTimer;
published
procedure Execute ;
override;
public
constructor Create(CreateSuspended: Boolean);
destructor Destroy;
override;
end;

implementation
uses USMS, UCHint;
{ TMsgThread }
constructor TMsgThread.Create(CreateSuspended: Boolean);
begin
inherited Create(CreateSuspended);
FreeOnTerminate := true;
Synchronize(CreateTimer);
end;

procedure TMsgThread.CreateTimer;
begin
TMMsg := TTimer.Create(nil);
end;

destructor TMsgThread.Destroy;
begin
Synchronize(DestroyTimer);
inherited destroy;
end;

procedure TMsgThread.DestroyTimer;
begin
TMMsg.Free;
end;

procedure TMsgThread.Execute;
begin
inherited;
Application.ProcessMessages;
RunTimer;
end;

procedure TMsgThread.RunTimer;
begin
TMMsg.Interval := 200;
TMMsg.OnTimer := TimerOnTimer;
TMMsg.Enabled := True;
end;

procedure TMsgThread.TimerOnTimer(Sender: TObject);
begin

{我的代码,耗时操作,
对串口操作}
end;
 
不用timer
procedure TMsgThread.Execute;
begin
inherited;
sleep(200);

RunTimer;
end;

procedure TMsgThread.RunTimer;
begin

{我的代码,耗时操作,
支串口操作}
end;
 
想具备Timer的特征的话,还需要有以下的改动,要不它只执行一次就退出了。
procedure TMsgThread.Execute;
begin
while truedo
begin
sleep(200);
RunTimer;
if 退出条件 then
Break;
end;
end
 
谢谢楼上的两位.
改善了好多.不用定时器.
然后在主程序中如下操作:
MsgThread := TMsgThread.Create(True) ;
while truedo
MsgThread.Execute ;
实现了定时操作功能.
但是还有一事不明,为何加了定时器没有改善呢? 能不能给解释 一下.
 
Execute;执行完后,线程就挂起或释放了. 你只是在线程中打开timer后线程就停止工作了,而timer过程并不是线程执行的,所以等于白用.
 
是不是定时器的消息必须有窗体接收,它创建的时候我调用了Synchronize(CreateTimer);
在它运行的时候是不是也必须在主线程中运行,主窗体接收它的消息? 已经和我创建的线程无关了.
 
在主程序中如下操作:
MsgThread := TMsgThread.Create(True) ;
while truedo
MsgThread.Execute ;
晕呀,主程序结束不了了.
结束时的代码如下:
MsgThread.Terminate ;
Application.Terminate ;
 
建议你使用WaitForSingleObject或者waitformultiobjects来做吧,使用sleep虽然可以实现定时器了,但是在你关闭软件的时候,通常会出现错误,软件界面死的状况,所以建议使用实践event来处理,而上面的两个waitfor……函数就是等待事件发生的,你可以看看delphi深度历险这本书,上面专门讲解了定时器的。
 
刚学线程,不明白怎么回事,就不要乱试,有时间多看些基础资料,要节省时间的多.
你调用的不正确.
有兴趣了解的话, 请联系我的msn. 点我名字可以看到.
 
结束线程已经搞定了
我也想用waitforXXX,但是得不到那个对串口操作事件的Handle呀,怎么搞一下.
 
多人接受答案了。
 
后退
顶部