日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

c语言timer linux 回调函数_SetTimer 与 回调函数

發布時間:2024/8/1 linux 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言timer linux 回调函数_SetTimer 与 回调函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在控制臺應用程序中,SetTimer的函數原型為:

UINT_PTR SetTimer(

HWND hWnd,//handle to window

UINT_PTR nIDEvent, //timer identifier

UINT uElapse, //time-out value

TIMERPROC lpTimerFunc //timer procedure

);

具體的解釋可以看MSDN,主要是第四個參數,定義的參數類型為 TIMERPROC

VOID CALLBACK TimerProc(

HWND hwnd,//handle to window

UINT uMsg, //WM_TIMER message

UINT_PTR idEvent, //timer identifier

DWORD dwTime    //current system time

);

怎樣在控制臺應用程序中定義自己的回調函數呢?

回調函數說白了就是事件響應程序,Windows的每個消息可以理解為一個事件,事件的響應代碼要由用戶自己來定義。用戶定義了事件響應的代碼,但還要Windows知道這段代碼的位置(要不然Windows就不知道如何去調用,這也沒有用),于是用戶需要將回調函數的指針告訴Windows,最典型的例子是在窗口類的結構(WNDCLASS)中給lpfnWndProc分量賦回調函數指針值。 ? ?回調函數的參數格式是由回調函數的調用者(一般是Windows)來定義的,而回調函數的實現者必須遵循這種格式。Windows程序是以事件驅動模型為基礎的,這就必然要用到回調函數這種機制。

如果有時間,不妨看看MESSAGE_MAP宏,消息映射是回調函數,只是這種回調函數的用法不同而已。普通的回調函數是要你提供地址,傳進某個函數,由它去調用;而消息映射函數,卻是由你定義函數,由MESSAGE_MAP宏去取得地址,并實現它的調用。

回調函數是一個程序員不能顯式調用的函數;通過將回調函數的地址傳給調用者從而實現調用。要實現回調,必須首先定義函數指針。盡管定義的語法有點不可思議,但如果你熟悉函數聲明的一般方法,便會發現函數指針的聲明與函數聲明非常類似。

typedef void (*f1)(); //為函數指針聲明類型定義

void (*p)();         //p是指向某函數的指針//定義一個函數

voidfunc1()

{/*do something*/printf("From func1(), Hello World!/n");

}//定義一個調用函數指針的回調函數

void caller(void(*ptrfunc1)( ))

{

ptrfunc1();/*調用ptr指向的函數*/}//typedef bool (*f2) (int *);//為函數指針聲明類型定義//bool (*q) (int *);//p是指向某函數的指針

bool func2(int*t_i)

{

printf("From func2() = %d, Hello World!/n", (*t_i)++);return true;

}void caller2(bool (*ptrfunc2)(int *), int *i)

{

ptrfunc2(i);/*調用ptr指向的函數*/}int main(int argc, char*argv[])

{

printf("From main(), Hello World!/n");

printf("/n");//無參數調用

p = func1; /*傳遞函數地址地址*/caller(p);/*傳遞函數地址到調用者*/

//有參數調用

int i = 0;for (int j = 0; j < 10; j++)

{

caller2(func2,&i); //* 傳遞函數地址到調用者 */

}//有參數調用第二次

i = 0;//q = func2; /* 傳遞函數地址地址 *///caller2(q, &i); /* 傳遞函數地址到調用者 */

printf("/n");

printf("From main(), Hello World!/n");

getchar();return 0;

}

我們以在控制臺中定義一個SetTimer函數為例子,見如下代碼:

#include #include

using namespacestd;

VOID CALLBACK Func(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime )

{

MessageBox(NULL,"Hello","ALARM",1);

}voidmain()

{

MSG msg;

SetTimer(NULL,1,1000, (TIMERPROC)Func);while( GetMessage(&msg,NULL,NULL,NULL))

{if (msg.message ==WM_TIMER)

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

}

}

剛開始的時候以為不用設置消息循環,所以沒有寫循環,才出現了各種錯誤。

總結

以上是生活随笔為你收集整理的c语言timer linux 回调函数_SetTimer 与 回调函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。