c语言timer linux 回调函数_SetTimer 与回调函数
在控制台应用程序中,SetTimer的函数原型为:
UINT_PTR SetTimer(
HWND,// handle to window
UINT_PTR,// timer identifier
UINT,// time-out value
TIMERPROC);具体的解释可以看MSDN,主要是第四个参数,定义的参数类型为 TIMERPROC
VOID CALLBACK TimerProc(
HWND,// handle to window
UINT,// WM_TIMER message
UINT_PTR,// timer identifier
DWORD);
怎样在控制台应用程序中定义自己的回调函数呢?
回调函数说白了就是 事件响应程序,Windows的每个消息可以理解为一个事件,事件的响应代码要由用户自己来定义。用户定义了事件响应的代码,但还要Windows知道这段代码的位置(要不然Windows就不知道如何去调用,这也没有用),于是用户需要将回调函数的指针告诉Windows,最典型的例子是在窗口类的结构(WNDCLASS)中给lpfnWndProc分量赋回调函数指针值。回调函数的参数格式是由回调函数的调用者(一般是Windows)来定义的,而回调函数的实现者必须遵循这种格式。Windows程序是以事件驱动模型为基础的,这就必然要用到回调函数这种机制。
如果有时间,不妨看看MESSAGE_MAP宏,消息映射是回调函数,只是这种回调函数的用法不同而已。普通的回调函数是要你提供地址,传进某个函数,由它去调用;而消息映射函数,却是由你定义函数,由MESSAGE_MAP宏去取得地址,并实现它的调用。
回调函数是一个程序员不能显式调用的函数;通过将回调函数的地址传给调用者从而实现调用。要实现回调,必须首先定义函数指针。尽管定义的语法有点不可思议,但如果你熟悉函数声明的一般方法,便会发现函数指针的声明与函数声明非常类似。
typedef void ( *f1 ) ( );// 为函数指针声明类型定义
void ( *p ) ( ); //p是指向某函数的指针
//定义一个函数
void func1()
{
/* 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 namespace std;
VOID CALLBACK Func(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime )
{
MessageBox(NULL,"Hello","ALARM",1);
}
void main()
{
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 与回调函数相关推荐
- c语言timer linux 回调函数_Linux下用C语言实现定时器
2020-02-22 关键字:alarm().setitimer().拦截定时器信号.定时器信号有效范围 在 Linux 中实现定时器功能的比较简单且好用的系统内置的方法有两种: 1.alarm() ...
- c语言timer linux 回调函数_C语言回调函数详解
1. 什么是回调函数? 回调函数,光听名字就比普通函数要高大上一些,那到底什么是回调函数呢?恕我读得书少,没有在那本书上看到关于回调函数的定义.我在百度上搜了一下,发现众说纷纭,有很大一部分都是使用类 ...
- 【C语言进阶深度学习记录】三十二 函数指针与使用函数指针实现回调函数
回调函数是非常重要的概念 文章目录 1 函数的类型 2 函数指针 2.1 函数指针的使用 2.2 使用函数指针实现回调函数 3 总结 1 函数的类型 跟以前学数组的时候是一样的,C语言中的数组是有自己 ...
- typedef函数指针_C语言函数指针之回调函数
1 什么是回调函数? 首先什么是"回调"呢? 我的理解是:把一段可执行的代码像参数传递那样传给其他代码,而这段代码会在某个时刻被调用执行,这就叫做回调. 如果代码立即被执行就称为同 ...
- c语言函数指针封装函数,C语言之函数指针、回调函数的使用
一.背景 首先看下如下代码,这个定义是放在头文件的,在程序中tCdrvCallbackFkt也定义了另一个变量,而且括号后面还跟定义了几个变量,不理解这个定义. typedef void (PUBLI ...
- C语言指针数组,数组指针,函数指针,函数指针数组,函数指针数组的指针,回调函数
C语言指针的一些知识点 指针 指针数组和数组指针的概念 函数指针,函数指针数组,函数指针数组的指针 回调函数 指针 1.指向对象的指针 int *p = new int(10); delete p; ...
- C语言中函数指针和回调函数的详解
函数指针:指向函数的指针变量. 因此"函数指针"本身首先应是指针变量,只不过该指针变量指向函数.这正如用指针变量可指向整型变量.字符型.数组一样,这里是指向函数.如前所述,C在编译 ...
- open函数返回-1_深入浅出剖析C语言函数指针与回调函数
微信公众号:杨源鑫如果你觉得本文对你有帮助,欢迎留言探讨! 一.C语言回调函数 什么是回调函数? 百度的权威解释如下: 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给 ...
- c语言键盘回调函数键盘的码,深入浅出剖析C语言函数指针与回调函数(三)
前面两篇文章: http://blog.csdn.net/morixinguan/article/details/65494239 http://blog.csdn.net/morixinguan/a ...
最新文章
- Javascript 返回上一页
- redisson redlock(基于redisson框架和redis集群使用分布式锁)
- mysql读写分离和分布式_MySQL主从复制与读写分离
- 【CF868F】Yet Another Minimization Problem (决策单调性优化dp+分治)
- java opencv磨皮算法_使用OPENCV简单实现具有肤质保留功能的磨皮增白算法
- 移植linux内核-映像文件,移植Linux内核-映像文件
- 利用rman配置DG环境
- 韩国各大银行纷纷开始引进区块链技术
- Bailian2792 集合加法【数学】
- Python开发者必知的13个Python GUI库
- ubuntu修改源为阿里云
- 计算机毕业论文基于springboot的社区物业服务管理项目源码
- matlab磁盘内存,Matlab内存不足问题的解决【转】
- SpringBoot最佳实践,它来了,它来了
- 雷鸣的游戏人生(六) --- 如何开始学习编程?
- 固体理论习题演练双时格林函数的运动方程
- 什么是接口测试,我们如何实现接口测试?
- 手把手教你创建个人微信公众号
- 搜狗关键词PC排名 接口
- 移动应用开发测试工具Bugtags集成和使用教程【转载】