在Windows C下采用timeSetEvent函数来设置定时器

关于timeSetEvent的函数原型及注释如下所示:

MMRESULT timeSetEvent(UINT           uDelay,       // 定时事件的触发周期,单位为毫秒UINT           uResolution,  // 定时事件的精度,单位为毫秒;值越小精度越高,LPTIMECALLBACK lpTimeProc,   // 定时事件的回调函数,每周期就调用该回调函数DWORD_PTR      dwUser,       // 用户提供的回调数据,可以默认置为0UINT           fuEvent       // 定时器的类型
);

**lpTimeProc:**触发事件的回调函数,回调函数的声明如下:

void WINAPI CallBackFunc(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2);
// uTimerID 为定时器的ID,

**fuEvent:**定时器的类型,分为以下两种类型:

​ TIME_ONESHOT:当经过 uDelay 时间之后,只调用一次

​ TIME_PERIODC:周期执行,每经过 uDelay 时间,就调用一次

**返回值:**当函数执行成功,就返回该定时器的ID,如果失败则返回NULL

下面为 timeSetEvent 函数的应用示例:

#include <Windows.h>                //需要包含该头文件
#include <iostream>
using namespace std;#pragma comment(lib,"Winmm.lib")  //For timeSetEvent//定时器的回调函数
void WINAPI TimerCallback(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2)
{cout << ">>> 定时器回调函数" << endl;
}int main()
{DWORD_PTR dwUser = NULL;// 设置定时器int timerID = timeSetEvent(1000, 1, (LPTIMECALLBACK)TimerCallback, dwUser, TIME_PERIODIC);    if(timerID != NULL)cout << ">>> 定时器创建成功" << endl;char ch = '0';while(ch != 'q'){ch = getchar();}timeKillEvent(timerID);    //关闭定时器return 0;
}

不过,在MSDN上看到, timeSetEvent 函数已经过时了,现在都在用 CreateTimerQueueTimer 函数。

周期和网络调试助手通信

前面一篇文章:Windows下C语言程序和网络调试助手通信

已经讲解了C语言程序和网络调试助手之间的通信,现在我们更进一步,创建周期性的C语言程序来和网络调试助手进行通信。

创建周期性的函数任务,我们需要使用定时器,利用Windows提供的timeSetEvent,我们可以方便地创建出周期性的函数任务。

代码如下:

#include <Windows.h>                //需要包含该头文件
#include <stdio.h>#pragma comment(lib,"Winmm.lib")  //For timeSetEvent#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib")  //加载 ws2_32.dll//定时器1的回调函数
void WINAPI TimerCallback1(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2)
{WSADATA wsaData;WSAStartup(MAKEWORD(2, 2), &wsaData);//创建套接字SOCKET sock = socket(PF_INET, SOCK_DGRAM, 0);//服务器地址信息struct sockaddr_in servAddr;memset(&servAddr, 0, sizeof(servAddr));  //每个字节都用0填充servAddr.sin_family = PF_INET;servAddr.sin_addr.s_addr = inet_addr("127.0.0.1");servAddr.sin_port = htons(1234);printf("我是第一个周期函数,周期为1s\n");char buffer[100] = "wiliyuan";sendto(sock, buffer, strlen(buffer), 0, (struct sockaddr*)&servAddr, sizeof(servAddr));}//定时器2的回调函数
void WINAPI TimerCallback2(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2)
{WSADATA wsaData;WSAStartup(MAKEWORD(2, 2), &wsaData);//创建套接字SOCKET sock = socket(PF_INET, SOCK_DGRAM, 0);//服务器地址信息struct sockaddr_in servAddr;memset(&servAddr, 0, sizeof(servAddr));  //每个字节都用0填充servAddr.sin_family = PF_INET;servAddr.sin_addr.s_addr = inet_addr("127.0.0.1");servAddr.sin_port = htons(2345);printf("我是第二个周期函数,周期为2s\n");char buffer[100] = "xky";sendto(sock, buffer, strlen(buffer), 0, (struct sockaddr*)&servAddr, sizeof(servAddr));}int main()
{DWORD_PTR dwUser = NULL;// 设置定时器int timerID1 = timeSetEvent(1000, 1, (LPTIMECALLBACK)TimerCallback1, dwUser, TIME_PERIODIC);    if(timerID1 != NULL)printf("定时器1创建成功\n");int timerID2 = timeSetEvent(2000, 1, (LPTIMECALLBACK)TimerCallback2, dwUser, TIME_PERIODIC);    if(timerID2 != NULL)printf("定时器2创建成功\n");    while(1){;}timeKillEvent(timerID1);    //关闭定时器1timeKillEvent(timerID2);    //关闭定时器2return 0;
}

该代码创建了两个周期函数,一个周期为1000ms,一个为2000ms。两个周期函数都通过UDP通信向外发送数据。发送目标ip都为127.0.0.0,一个端口号为1234,一个为2345。

我们打开两个网络调试助手,设置成上面的参数,运行代码,结果如下图所示:

Windows下使用C语言创建定时器并周期和网络调试助手通信相关推荐

  1. Windows下在Django中创建项目时ImportError: No module named django.core解决方法

    Windows下在Django中创建项目时ImportError: No module named django.core解决方法 今天在对照<Python编程:从入门到实践>学## 标题 ...

  2. Windows下MongoDB安装及创建用户名和密码

    Windows下MongoDB安装及创建用户名和密码 下载MongoDB的安装文件https://www.mongodb.com/download-center#community,选择合适的版本(注 ...

  3. Windows下使用C语言的周期UDP编程同时发送和接收网络调试助手数据

    代码: #include <Windows.h> //需要包含该头文件 #include <stdio.h>#pragma comment(lib,"Winmm.li ...

  4. Windows下使用C语言的UDP编程接收网络调试助手发送的数据

    代码 #include <stdio.h> #include <winsock2.h> #pragma comment (lib, "ws2_32.lib" ...

  5. windows下编译c语言文件路径,解决JNI在Windows环境下因长路径导致编译失败问题

    之前听一个朋友反馈LuaScriptoCore在Windows下编译会报错,今天特意跑到Windows环境下测试了一番,果然是存在问题.得到了下面的编译报错信息: Build command fail ...

  6. vscode在Windows下配置C语言环境,设置三个配置文件

    一.需要下载的安装包: 1.vscode 直接在微软官方下载最新的vscode 2.MinGw64 里面包含了gcc.gdb等前一个是编译器,后一个是debug的 传送链接: MinGW64 往下拉点 ...

  7. php编码和c语言,急求windows下用c语言开发PHP扩展时,在C语言里把字符串转成utf-8编码再打印的方法。...

    因我是用windows下用c开发PHP扩展时, 想在C的函数内直接打印php_printf某字符串(其中含有汉字字符), 但在PHP调用这个函数时,看到的时汉字乱码.PHP页面用的是utf-8编码格式 ...

  8. Linux下用C语言最基本的程序开发与调试

    1.建一个目录 2.写代码,建一个hello.c文件 代码: view plaincopy to clipboardprint? #include "stdio.h" main() ...

  9. Windows下Git库的创建

    图形化 打开Git GUI 选择"创建新的版本库": 选择要创建的目录,单击"新建"后,即可完成对Git库的创建,创建完成后会出现如下界面: 并在Git仓库目录 ...

最新文章

  1. VS2013 编译使用 stlport
  2. SpringBoot+JPA简单入门demo
  3. MongoDB windows解压缩版安装
  4. 路遥工具箱全面迁移至 .NET 6.0 并发布 3.0 版本及迁移记录详解
  5. php树形数据结构是什么,数据结构 之 树
  6. 虚拟机常见的几种上网方式
  7. 模糊算法 matlab,几种模糊控制算法的MATLAB仿真.pdf
  8. GIS应用技巧之世界各国矢量获取途径
  9. 考研高等数学张宇30讲笔记——第十一讲 多元函数微分学
  10. 光纤上网究竟是如何实现的?
  11. 一禅小和尚的人生哲学
  12. 怎样用html制作歌词字幕,pr歌词字幕制作方法
  13. html 鼠标形状箭头,CSS各种鼠标样式介绍
  14. 导热电池粘合剂市场现状及未来发展趋势
  15. 古代益智游戏汉诺塔java解决
  16. SpringBoot中使用Easyexcel实现Excel导入导出功能(三)
  17. doNet面试宝典-常见整理(重复率高)
  18. 2021赤峰二中高考成绩查询,2021年赤峰高考状元名单公布,赤峰高考状元学校资料及最高分...
  19. 服务器导出连接日志文件,Windows文件共享日志审计功能及输出到syslog服务器
  20. linux内核配置高精度时钟,关于linux内核中使用的时钟

热门文章

  1. EET_loss学习
  2. 常用模型结构(FNN、CNN、RNN、TDNN、FSMN、Attention)
  3. PVE7.3 切换内核版本
  4. 大数据应用常用打包方式
  5. 图片旋转python
  6. 计算机考研专业课统考科目,考研统考考什么科目?计算机考什么呢?
  7. SAP 基本计量单位与采购订单单位不一致的问题处理
  8. git命令及git合并分支进行多人协作
  9. remine搭建+集成scrum插件
  10. Windows组件没有Internet信息服务(IIS)选项解决设置方法