Delphi线程定时器TThreadedTimer及用法--还有TThreadList用法可以locklist

Delphi线程定时器 - -人生如歌- - 博客园
http://www.cnblogs.com/zhengwei0113/p/4192010.html

 

(*


  自己编写的线程计时器,没有采用消息机制,很有效

  Cobbler续写

  不用 TTimer 的原因:

  要说TTimer类的使用问题,先要说一下它响应用户定义的回调函数(OnTimer)的方法。
  TTimer拥有一个HWnd类型的成员变量FWindowHandle,用于捕捉系统消息。
  TTimer在Enable的情况下,每隔Interval时间,就抛一个系统消息WM_TIMER,FWindowHandle捕捉到这个消息后,
  就会执行用户的回调函数,实现用户需要的功能。就是这个消息机制引发了下面两个问题:

  问题1: 还不算严重,TTimer与系统共用一个消息队列,也就是说,在用户回调函数处理完之前,
  所有的系统消息都处于阻塞状态,包括界面的更新的消息。
  如果你的回调函数瞬间执行完毕那就一切看着还正常,如果你要执行一个复杂耗时的操作,
  比如数据库查询什么的(万一遇到数据库联接不正常,等待20秒),
  那你的界面就必死无疑,直到回调函数执行完。如果是后台系统还好,
  要是给用户使用的就没法交待了。即使你在子线程里面使用也不会解决的。

  问题2: 一般系统定义消息的优先级比用户定义消息的优先级要低。
  在子线程中使用TTimer时,如果线程间通信也大量使用自定义消息,
  并且用户定义自己的消息处理函数,那WM_TIMER经常就会被丢弃了,
  计时器就彻底失效了。

  摘抄自网络

*)

unit UntThreadTimer;

interface

uses
  Windows, Classes, Winapi.Messages;

type
  TTimerStatus = (TS_ENABLE, TS_CHANGEINTERVAL, TS_DISABLE, TS_SETONTIMER);
  TThreadedTimer = class;
  TTimerThread = class;
  PTimerThread = ^TTimerThread;

  TTimerThread = class(TThread)
    OwnerTimer: TThreadedTimer;
    Interval: DWord;
    Enabled: Boolean;
    Status: TTimerStatus;
    constructor Create(CreateSuspended: Boolean);
    destructor Destroy; override;
    procedure Execute; override;
    procedure DoTimer;
  end;

  TThreadedTimer = class(TComponent)
  private
    FHandle: THandle;
    FEnabled: Boolean;
    FInterval: DWord;
    FOnTimer: TNotifyEvent;
    FTimerThread: TTimerThread;
    FThreadPriority: TThreadPriority;
  protected
    procedure UpdateTimer;
    pro
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值