读书人

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

发布时间: 2012-02-27 10:00:22 作者: rapoo

请教:关于一个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则没有这个问题。

读书人网 >.NET

热点推荐