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

news2024/11/18 17:51:39

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

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

MMRESULT timeSetEvent(
  UINT           uDelay,       // 定时事件的触发周期,单位为毫秒
  UINT           uResolution,  // 定时事件的精度,单位为毫秒;值越小精度越高,
  LPTIMECALLBACK lpTimeProc,   // 定时事件的回调函数,每周期就调用该回调函数
  DWORD_PTR      dwUser,       // 用户提供的回调数据,可以默认置为0
  UINT           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);    //关闭定时器1
	timeKillEvent(timerID2);    //关闭定时器2
	return 0;
}

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D6j7S4lE-1670767587306)(C:\Users\10521\AppData\Roaming\Typora\typora-user-images\image-20221211220109807.png)]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/81181.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

161-183-mysql-高级篇-事务-锁-mvcc

116-mysql-事务篇-锁&#xff1a; 推荐网站 mysql学习网站&#xff1a;https://www.bilibili.com/video/BV1iq4y1u7vj?p109&vd_source39a1ba1654411bc9ab90f6f2926600b7 mysql&#xff1a;https://dev.mysql.com/doc/refman/8.0/en/ 算法&#xff1a;https://www.cs.us…

我看世界杯——来自一个“假”球迷视角

世界杯还有一个星期就要结束了&#xff0c;说实话&#xff0c;我之前是一场球都没有&#xff0c;对足球知道也甚少&#xff0c;妥妥一个假球迷了。这次世界杯感觉离自己特别近&#xff0c;身边的很多朋友都在看&#xff0c;也不乏赌球的小伙伴&#xff0c;自己的感悟也比较深&a…

电机定子模态的空间特征

对于电机定子模态而言&#xff0c;通常不是按传统的阶次顺序&#xff08;按频率从小到大&#xff09;来描述它们&#xff0c;而是按空间节点数的顺序来描述&#xff0c;这在很大程度上是因为受激励的电磁力波的振型的影响。 1、传统模态阶次表示方式 传统模态阶次的顺序都是按…

安卓期末大作业——个人简历APP源码和设计报告

Android课程需求文档 设计题目&#xff1a; 个人简历APP 学生姓名&#xff1a; 学号&#xff1a; 1&#xff0e;Smart.apk功能设计说明 Android真机运行进入该app。背景音乐服务播放正常&#xff0c;并设置可通过右上角按钮关闭musicservice&#xff1b; 1通过viewpager实…

Jenkins+SonarQube 代码质量检测详解

一、SonarQube 概述 1、SonarQube 简介 Sonar Qube是一个开源的代码分析平台,支持Java、Python、PHP、JavaScript、CSS等25种以上的语言,可以检测出重复代码、代码漏洞、代码规范和安全性漏洞的问题。 Sonar Qube通过插件机制,Sonar可以集成不同的测试工具,代码分析工具…

【JavaWeb开发-Servlet】将项目打包部署在本地

Servlet与JSP进阶十&#xff1a;Web应用程序打包与发布&#xff08;war包&#xff09;_小枯林的博客-CSDN博客_servlet项目如何打成war包本篇博客主要内容是&#xff1a; ●如何使用Eclipse打war包&#xff1b; ●打好的war包如何发布&#xff1b;访问演示&#xff1b; ●解决u…

如何使用ChatGPT辅助AI绘画?

如何使用ChatGPT辅助AI绘画&#xff1f; AI自动化内容生成&#xff08;AIGC&#xff09;是一种利用人工智能技术生成新内容的方法。它可以快速、自动、准确地从大量原始数据中生成新内容&#xff0c;大大提高了内容创作效率。AIGC 使用机器学习算法&#xff0c;自动识别文本特…

【MySQL】触发器

目录 概述 操作-创建触发器 操作-NEW与OLD 其他操作 注意事项 概述 介绍 触发器&#xff0c;就是一种特殊的存储过程。触发器和存储过程一样是一个能够完成特定功能、存储在数据 库服务器上的SQL片段&#xff0c;但是触发器无需调用&#xff0c;当对数据库表中的数据执…

微信小程序|前端技术主要框架分析

1.框架 微信提供了一套自己的用于开发小程序的前端框架,和目前主流的前端框架相比,其既有类似的地方,也有特殊的地方。 特殊的地方在于其只能在微信小程序开发工具内使用,并做了相对严格的使用和配置限制,开发者必须按照其规定的用法来使用。一些外部的框架和插件在小程…

apis-day7综合案例

apis-day7综合案例-小兔鲜案例注册 需求①&#xff1a; 发送验证码 用户点击之后&#xff0c;显示 05秒后重新获取 时间到了&#xff0c;自动改为 重新获取 需求②&#xff1a; 用户名验证&#xff08;注意封装函数 verifyxxx&#xff09; 正则 /1{6,10}$/ 如果不符合要求…

非零基础自学Golang 第1章 走进Go 1.1 Go编程语言概述 1.1.3 使用Go 语言的项目

非零基础自学Golang 文章目录非零基础自学Golang第1章 走进Go1.1 Go编程语言概述1.1.3 使用Go 语言的项目第1章 走进Go 1.1 Go编程语言概述 1.1.3 使用Go 语言的项目 Go语言在2009年首次公开发布后受到越来越多的开发者的关注&#xff0c;Go语言社区不断壮大&#xff0c;开源…

【深度学习】李宏毅2021/2022春深度学习课程笔记 - Deep Learning Task Tips

文章目录一、深度学习步骤回顾二、常规指导三、训练过程中Loss很大3.1 原因1&#xff1a;模型过于简单3.2 原因2&#xff1a;优化得不好3.3 原因1 or 原因2 &#xff1f;四、训练过程Loss小。测试过程Loss大4.1 原因1&#xff1a;过拟合 Overfitting4.2 原因2&#xff1a;Misma…

windows 10 HBase保姆级安装教程

安装HDFS 将下载好的hadoop-2.6.5.zip解压到自己的磁盘文件&#xff0c;将解压后的文件夹hadoop-2.6.5重命名为hadoop&#xff1b; 解压hadoopbin.zip&#xff0c;将解压后的文件夹打开&#xff0c;里面的文件复制到上一步的hadoop文件夹下的bin文件&#xff0c;直接覆盖同名文…

蓝牙模块HC-05使用指南

概述 HC-05蓝牙模块是一种基于蓝牙协议的简单无线通信设备。该模块基于BC417单芯片蓝牙IC&#xff0c;符合蓝牙v2.0标准&#xff0c;支持UART和USB接口。 具有两种工作模式&#xff1a;命令响应工作模式和自动连接工作模式。 当模块处于命令响应工作模式&#xff08;或者AT模…

文件传输利器Croc

概述 一般而言&#xff0c;Linux系统是没有用户界面的&#xff0c;所有操作都是在命令行里。 然后在安装搭建集群&#xff0c;如分布式的Hadoop集群时&#xff0c;经常需要在多个Server之间传输文件。两个server之间的文件传输&#xff0c;一般会想到FTP或SSH两种方式。使用F…

监控系列(二)Dem对接Prometheus+grafana显示

一、概括 本篇不涉及达梦数据库搭建以及Dem的搭建&#xff0c;操作环境需提前准备prometheus以及grafana的搭建&#xff0c;请跳转到前文查看整体的对接流程如图所示 二、Dem对接prometheus 前提 需确保当前Dem&#xff0c;已有集群纳入监管 配置Dem的监控机器数据指标 prome…

第十九章 Bellman-Ford算法(由SPFA算法逆推BF,独特解读,超级详细)

第十九章 Bellman-Ford算法一、SPFA算法回顾&#xff1a;二、Bellman-Ford算法1、算法推导&#xff1a;1、算法模板&#xff1a;三、例题&#xff1a;1、问题&#xff1a;2、模板&#xff1a;3、分析&#xff1a;一、SPFA算法回顾&#xff1a; 我们在第18章中利用dijkstra算法…

【多数据源动态切换】Spring Boot中实现多数据源动态切换效果(1):通过继承AbstractRoutingDataSource类实现

在Spring Boot中&#xff0c;可以通过多种方式实现多数据源的动态切换效果&#xff0c;本篇介绍第一种实现方案。 一 AbstractRoutingDataSource Spring Boot提供了org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource 这个类&#xff0c;其中#determineC…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java校园花卉销售系统ef5ox(1)

做毕业设计一定要选好题目。毕设想简单&#xff0c;其实很简单。这里给几点建议&#xff1a; 1&#xff1a;首先&#xff0c;学会收集整理&#xff0c;年年专业都一样&#xff0c;岁岁毕业人不同。很多人在做毕业设计的时候&#xff0c;都犯了一个错误&#xff0c;那就是不借鉴…

redis之作为分布式锁使用

写在前面 本文一起看下redis作为分布式锁使用的相关内容。 1&#xff1a;怎么算是锁或没锁 锁和没锁本身其实就是用一个变量的值来表示&#xff0c;比如变量lock&#xff0c;当值为1时代表处于上锁状态&#xff0c;当值为0时表示没有锁&#xff0c;那么多线程想要获取锁的话…