技術交流,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...