Win32程式設計 SetTimer的使用

2021-08-30 16:25:00 字數 1769 閱讀 2141

settimer函式和wm_timer訊息是win32 api中最基本的玩意兒了,任何初學win32 api程式設計的人都應該對此很熟悉吧。在這篇文章中,讓我們來深入了解一下和settimer相關的使用和應用。

uint_ptr settimer(

hwnd hwnd,

uint_ptr nidevent,

uint uelapse,

timerproc lptimerfunc

我們經常使用的情況是hwnd不為null,lptimerfunc為null,在這種情況下系統每隔nidevent毫秒會向hwnd視窗投遞wm_timer訊息。唯一需要注意的是:

1.自2000起,uelapse範圍是user_timer_minimum到user_timer_maximum。超出得話,uelapse設定為1。

2.wm_timer訊息其實是在dispatchmessage函式中直接呼叫hwnd的視窗過程,並且優先順序很低,只有在訊息佇列中沒有其它訊息的情況下,dispatchmessage才會考慮wm_timer。

3.使用相同的nidevent可以重置這個timer,並且killtimer(hwnd,nidevent)來銷毀這個timer。

我們再來考慮hwnd為null的情況:

1.首先,最重要的是killtimer時,傳入的timer id必須是settimer的返回值,而不是呼叫settimer時傳入的nidevent引數。

2.呼叫settimer時,如果nidevent為0或者是其它沒有被使用的timer id,則settimer會返回乙個新的timer id。否則,就是重新設定這個timer。

3.如果有lptimerfunc的話,則lptimerfunc的引數nidevent是settimer返回的值,而不是你呼叫settimer時傳入的值。

最後看一下lptimerfunc不為null的情況:lptimerfunc會在dispatchmessage函式中被直接呼叫,而不會去呼叫hwnd的視窗過程(也就是說收不到這個訊息),無論hwnd是不是null。(這裡,msdn中貌似有點問題,settimer的remark部分說lptimerfunc會在預設視窗中被呼叫,而wm_timer中說lptimerfunc在dispatchmessage中被呼叫)

應用使用lptimerfunc可以做乙個延時的操作,或者把某些操作推遲到下乙個訊息迴圈,而不需要為視窗定義乙個新的timer id。

例如,我很喜歡這樣寫:

struct _data

void callback timerproc(hwnd hwnd,

uint umsg,

uint_ptr idevent,

dword dwtime)

_data * data = (_data*)idevent;

killtimer(hwnd,idevent);

//do something

free(data);

_data * data = (_data*)malloc(sizeof(_data));

settimer(afxgetmainwindow()->m_hwnd,(uint_ptr)data,10,&timerproc);

首先,使用了timerproc,不會使視窗收到wm_timer訊息,那樣可以使用idevent來傳遞自定義資料而不會和視窗自己使用的timer id衝突。

其次,第乙個引數hwnd不能為null,否則timerproc的idevent引數就不是你傳入的自定義資料了。

最後,msdn說settimer不能跨執行緒使用,所以最好不要用這樣的方法在向ui執行緒來插入**,還是老老實實的發訊息吧。

Win32程式設計

win32 malloc函式的底層實現是win32api utf 16編碼以16位無符號整數為單位,注意是16位為乙個單位,不是乙個字元就只有16位,這個要看字元的unicode編碼處於什麼範圍而定,有可能是2個位元組,也可能是4個位元組現在機器上的unicode編碼一般就是指utf 16 以兩個位...

WIN32程式設計模板

include lresult callback wndproc hwnd,uint,wparam,lparam int winapi winmain hinstance hinstance,hinstance hprevinstance,pstr szcmdline,int icmdshow te...

win32程式設計 1

1.winmain 1 myregisterclass hinstance 註冊視窗類 2 initinstance 初始化例項 3 while getmessage msg,null,0,0 getmessage從應用程式訊息佇列取乙個訊息,當取到wm quit時,返回假 作業系統向應用程式傳送一...