首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

请问:关于一个Timer控件的代码,多谢

2012-02-27 
请教:关于一个Timer控件的代码,谢谢.这段代码我不太懂.这是TThreadedTimer控件ThdTimer.pas的代码.可以安

请教:关于一个Timer控件的代码,谢谢.
这段代码我不太懂.这是TThreadedTimer控件ThdTimer.pas的代码.可以安装的.
与delphi常用的的TTimer有什么优越性?希望详细些.谢谢.

unit   ThdTimer;

interface

uses
    Windows,   Messages,   SysUtils,   Classes,   Graphics,   Controls,   Forms,   Dialogs;

const
    DEFAULT_INTERVAL   =   1000;

type
    TThreadedTimer   =   class;

    TTimerThread   =   class(TThread)
    private
        FOwner:   TThreadedTimer;
        FInterval:   Cardinal;
        FStop:   THandle;
    protected
        procedure   Execute;   override;
    end;

    TThreadedTimer   =   class(TComponent)
    private
        FOnTimer:   TNotifyEvent;
        FTimerThread:   TTimerThread;
        FEnabled,
        FAllowZero:   Boolean;

        procedure   DoTimer;

        procedure   SetEnabled(Value:   Boolean);
        function   GetInterval:   Cardinal;
        procedure   SetInterval(Value:   Cardinal);
        function   GetThreadPriority:   TThreadPriority;
        procedure   SetThreadPriority(Value:   TThreadPriority);
    public
        constructor   Create(AOwner:   TComponent);   override;
        destructor   Destroy;   override;

    published
        property   AllowZero:   Boolean   read   FAllowZero   write   FAllowZero   default   False;
        property   Enabled:   Boolean   read   FEnabled   write   SetEnabled   default   False;
        property   Interval:   Cardinal   read   GetInterval   write   SetInterval   default   DEFAULT_INTERVAL;
        property   OnTimer:   TNotifyEvent   read   FOnTimer   write   FOnTimer;
        property   ThreadPriority:   TThreadPriority   read   GetThreadPriority     write   SetThreadPriority   default   tpNormal;
    end;

procedure   Register;

implementation

{   TTimerThread   }

procedure   TTimerThread.Execute;
begin
    repeat
        if   WaitForSingleObject(FStop,   FInterval)   =   WAIT_TIMEOUT   then
            Synchronize(FOwner.DoTimer);
    until   Terminated;
end;

{   TThreadedTimer   }

constructor   TThreadedTimer.Create(AOwner:   TComponent);
begin
    inherited   Create(AOwner);
    FTimerThread   :=   TTimerThread.Create(True);
    with   FTimerThread   do
    begin
        FOwner   :=   Self;
        FInterval   :=   DEFAULT_INTERVAL;
        Priority   :=   tpNormal;



        //   Event   is   completely   manipulated   by   TThreadedTimer   object
        FStop   :=   CreateEvent(nil,   False,   False,   nil);
    end;
end;

destructor   TThreadedTimer.Destroy;
begin
    with   FTimerThread   do
    begin
        Terminate;

        //   When   this   method   is   called   we   must   be   confident   that   the   event   handle   was   not   closed
        SetEvent(FStop);
        if   Suspended   then
            Resume;
        WaitFor;
        CloseHandle(FStop);     //   Close   event   handle   in   the   primary   thread
        Free;
    end;
    inherited   Destroy;
end;

procedure   TThreadedTimer.DoTimer;
begin

    //   We   have   to   check   FEnabled   in   the   primary   thread
    //   Otherwise   we   get   AV   when   the   program   is   closed
    if   FEnabled   and   Assigned(FOnTimer)   then
        FOnTimer(Self);
end;

procedure   TThreadedTimer.SetEnabled(Value:   Boolean);
begin
    if   Value   <>   FEnabled   then
    begin
        FEnabled   :=   Value;
        if   FEnabled   then
        begin
            if   (FTimerThread.FInterval   >   0)   or
                ((FTimerThread.FInterval   =   0)   and   FAllowZero)   then
            begin
                SetEvent(FTimerThread.FStop);
                FTimerThread.Resume;
            end;
        end
        else
            FTimerThread.Suspend;
    end;
end;

function   TThreadedTimer.GetInterval:   Cardinal;
begin
    Result   :=   FTimerThread.FInterval;
end;

procedure   TThreadedTimer.SetInterval(Value:   Cardinal);
var
    PrevEnabled:   Boolean;
begin
    if   Value   <>   FTimerThread.FInterval   then
    begin
        PrevEnabled   :=   FEnabled;
        Enabled   :=   False;
        FTimerThread.FInterval   :=   Value;
        Enabled   :=   PrevEnabled;
    end;
end;

function   TThreadedTimer.GetThreadPriority:   TThreadPriority;
begin
    Result   :=   FTimerThread.Priority;
end;

procedure   TThreadedTimer.SetThreadPriority(Value:   TThreadPriority);


begin
    FTimerThread.Priority   :=   Value;
end;

procedure   Register;
begin
      RegisterComponents( 'AVCLASS ',   [TThreadedTimer]);
end;

end.


[解决办法]
一般的TIMER是靠消息触发的!这个是指定过程的!精确度应该会高一点!
普通的TIMER精确度好像在50毫秒左右!而且消息队列里面只能有一个TIMER消息,如果到时间后,新的消息不会再进入队列!
[解决办法]
与原有的timer控件多了一个ThreadPriority属性,可以设置优先级别,怎么用就不知道了
[解决办法]
TThreadedTimer在创建它的另外一个线程中执行,而TTimer在创建它的同一个线程中。所以用TTimer的时候,如果Timer的处理方法执行时用的时间比较长的话,会影响其他Timer,而用TThreadedTimer则没有这个问题。

热点排行