Delphi TTimer的原始碼

2021-09-05 22:58:21 字數 2401 閱讀 2698

技術交流,dh講解.

我之前用乙個執行緒實現了timer的功能,現在我們來看看delphi自帶的timer怎麼實現的?

其實,不看**也大致知道怎麼的?

1 settimer 和 killtimer 2個api來控制timer的啟動和關閉

2 響應wm_timer訊息執行使用者事件.

由於timer是乙個不可視控制項,應該從tcomponent繼承,但是tcomponent不具備處理訊息的能力,也就是我們需要手動建立窗體過程然後分配給它.

好說了這麼多,看**:

ttimer = class(tcomponent)

private

//間隔時間

finterval: cardinal;

//接收訊息的控制代碼

fwindowhandle: hwnd;

//使用者事件

fontimer: tnotifyevent;

fenabled: boolean;

//當屬性設定後,更新計時器

//kill掉已有的,然後建立新的

procedure updatetimer;

//setter

procedure setenabled(value: boolean);

procedure setinterval(value: cardinal);

procedure setontimer(value: tnotifyevent);

//窗體過程

procedure wndproc(var msg: tmessage);

protected

procedure timer; dynamic;

strict protected

procedure finalize; override;

public

constructor create(aowner: tcomponent); override;

destructor destroy; override;

published

property enabled: boolean read fenabled write setenabled default true;

property interval: cardinal read finterval write setinterval default 1000;

property ontimer: tnotifyevent read fontimer write setontimer;

end;

我們就看關鍵的方法updatetimer和wndproc窗體過程.

procedure ttimer.updatetimer;

begin

if fwindowhandle <> 0 then

killtimer(fwindowhandle, 1);

if (finterval <> 0) and fenabled and assigned(fontimer) then

begin

if fwindowhandle = 0 then

//分配控制代碼處理訊息

fwindowhandle := allocatehwnd(wndproc);

if settimer(fwindowhandle, 1, finterval, nil) = 0 then

raise eoutofresources.create(snotimers);

endelse

if fwindowhandle <> 0 then

begin

deallocatehwnd(fwindowhandle); //取消控制代碼處理訊息

fwindowhandle := 0;

end;

end;

窗體過程都幹了什麼呢?

procedure ttimer.wndproc(var msg: tmessage);

begin

with msg do

if msg = wm_timer then

trytimer;

except

endelse

//其他訊息,採用預設的windows處理方式

result := defwindowproc(fwindowhandle, msg, wparam, lparam);

end;

這個有個timer方法,幹什麼的呢?對了,就是執行使用者事件的.

procedure ttimer.timer;

begin

if assigned(fontimer) then fontimer(self);

end;

也很簡單嘛,主要讓大家看看控制項怎麼編寫的.

我是dh

ConcurrentHashMap的原始碼分析

put final v putval k key,v value,boolean onlyifabsent 在上一步的else if中 f 不為null時,則判斷f的hash值是否為moved,即 1,如果為 1,表示正在擴容 else if fh f.hash moved 協助資料遷移 tab h...

DispatcherServlet的原始碼和流程分析

1 自動配置dispatcherservlet和dispatcherservletregistry 2 註冊dispatcherservlet到servletcontext 3 初始化mvc的元件 handler執行完成後,向dispatcherservlet 返回乙個modelandview物件 ...

AbstractCollection原始碼分析

abstractcollection抽象類提供了collection的骨架實現,collection分析請看 這裡直接看它的 是如何實現的.public abstract iterator iterator 該方法沒有實現.public abstract int size 該方法沒有實現.publi...