在控制台应用程序中,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 与回调函数相关推荐

  1. c语言timer linux 回调函数_Linux下用C语言实现定时器

    2020-02-22 关键字:alarm().setitimer().拦截定时器信号.定时器信号有效范围 在 Linux 中实现定时器功能的比较简单且好用的系统内置的方法有两种: 1.alarm() ...

  2. c语言timer linux 回调函数_C语言回调函数详解

    1. 什么是回调函数? 回调函数,光听名字就比普通函数要高大上一些,那到底什么是回调函数呢?恕我读得书少,没有在那本书上看到关于回调函数的定义.我在百度上搜了一下,发现众说纷纭,有很大一部分都是使用类 ...

  3. 【C语言进阶深度学习记录】三十二 函数指针与使用函数指针实现回调函数

    回调函数是非常重要的概念 文章目录 1 函数的类型 2 函数指针 2.1 函数指针的使用 2.2 使用函数指针实现回调函数 3 总结 1 函数的类型 跟以前学数组的时候是一样的,C语言中的数组是有自己 ...

  4. typedef函数指针_C语言函数指针之回调函数

    1 什么是回调函数? 首先什么是"回调"呢? 我的理解是:把一段可执行的代码像参数传递那样传给其他代码,而这段代码会在某个时刻被调用执行,这就叫做回调. 如果代码立即被执行就称为同 ...

  5. c语言函数指针封装函数,C语言之函数指针、回调函数的使用

    一.背景 首先看下如下代码,这个定义是放在头文件的,在程序中tCdrvCallbackFkt也定义了另一个变量,而且括号后面还跟定义了几个变量,不理解这个定义. typedef void (PUBLI ...

  6. C语言指针数组,数组指针,函数指针,函数指针数组,函数指针数组的指针,回调函数

    C语言指针的一些知识点 指针 指针数组和数组指针的概念 函数指针,函数指针数组,函数指针数组的指针 回调函数 指针 1.指向对象的指针 int *p = new int(10); delete p; ...

  7. C语言中函数指针和回调函数的详解

    函数指针:指向函数的指针变量. 因此"函数指针"本身首先应是指针变量,只不过该指针变量指向函数.这正如用指针变量可指向整型变量.字符型.数组一样,这里是指向函数.如前所述,C在编译 ...

  8. open函数返回-1_深入浅出剖析C语言函数指针与回调函数

    微信公众号:杨源鑫如果你觉得本文对你有帮助,欢迎留言探讨! 一.C语言回调函数 什么是回调函数? 百度的权威解释如下: 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给 ...

  9. c语言键盘回调函数键盘的码,深入浅出剖析C语言函数指针与回调函数(三)

    前面两篇文章: http://blog.csdn.net/morixinguan/article/details/65494239 http://blog.csdn.net/morixinguan/a ...

最新文章

  1. Javascript 返回上一页
  2. redisson redlock(基于redisson框架和redis集群使用分布式锁)
  3. mysql读写分离和分布式_MySQL主从复制与读写分离
  4. 【CF868F】Yet Another Minimization Problem (决策单调性优化dp+分治)
  5. java opencv磨皮算法_使用OPENCV简单实现具有肤质保留功能的磨皮增白算法
  6. 移植linux内核-映像文件,移植Linux内核-映像文件
  7. 利用rman配置DG环境
  8. 韩国各大银行纷纷开始引进区块链技术
  9. Bailian2792 集合加法【数学】
  10. Python开发者必知的13个Python GUI库
  11. ubuntu修改源为阿里云
  12. 计算机毕业论文基于springboot的社区物业服务管理项目源码
  13. matlab磁盘内存,Matlab内存不足问题的解决【转】
  14. SpringBoot最佳实践,它来了,它来了
  15. 雷鸣的游戏人生(六) --- 如何开始学习编程?
  16. 固体理论习题演练双时格林函数的运动方程
  17. 什么是接口测试,我们如何实现接口测试?
  18. 手把手教你创建个人微信公众号
  19. 搜狗关键词PC排名 接口
  20. 移动应用开发测试工具Bugtags集成和使用教程【转载】

热门文章

  1. CPU硬件辅助虚拟化技术
  2. 计算机启动报警,我台式电脑开机报警四声什么問題?
  3. postsql——存储(TableSpace)
  4. 外观检测可以检测产品的哪些项目?
  5. 照片怎么无损放大?这样做只需三个步骤
  6. 塔式、机架式、刀片式服务器区别以及特点
  7. 表格内容拆分怎么快速完成
  8. 记一次 .NET 某工控自动化控制系统 卡死分析
  9. 欧拉角表示旋转会出现的问题——万向锁(Gimbal Lock)
  10. C语言利用uthash.h实现hashmap