C++ 定时器触发

c++定时器,能够定时触发,即每隔一段固定时间执行一下函数

#include <iostream>
#include <thread>
#include <chrono>
#include <signal.h>
#include <time.h>
#include <cstring>
#include <glog/logging.h>

#define EVENTSAVERTIMER_SIG (SIGRTMIN + 14)   // 设置信号
#define EvensTimerPeriod (5) // 5ms

// 定时器处理函数
void timerHandler(int sig, siginfo_t *si, void *uc) {
    LOG(ERROR) << "Timer triggered!" << std::endl;
}

void EventSaverTimerInit(void)
{

	/*配置一个Posix timer*/
	timer_t TimerPulse;
	struct sigevent Timer1_Pulse_Sig;
	struct sigaction Timer1_Pulse_Sa;
	struct itimerspec Timer1_Pulse_it; // 匹配pulse类型定时器1 的timer设定参数
	int res;

	Timer1_Pulse_Sa.sa_flags = SA_SIGINFO | SA_RESTART;
	Timer1_Pulse_Sa.sa_sigaction = timerHandler;
	sigemptyset(&Timer1_Pulse_Sa.sa_mask);
	if (sigaction(EVENTSAVERTIMER_SIG, &Timer1_Pulse_Sa, NULL) == -1)
	{
		perror("sigaction");
	}

	memset(&Timer1_Pulse_Sig, 0, sizeof(Timer1_Pulse_Sig));

	// 信号量配置
	Timer1_Pulse_Sig.sigev_value.sival_ptr = &TimerPulse;
	Timer1_Pulse_Sig.sigev_notify = SIGEV_SIGNAL;
	Timer1_Pulse_Sig.sigev_signo = EVENTSAVERTIMER_SIG;

	res = timer_create(CLOCK_REALTIME, &Timer1_Pulse_Sig, &TimerPulse);
	if (res != 0)
	{
		perror("TimerPulse create Error");
		return;
	}

	Timer1_Pulse_it.it_value.tv_sec = 0; // 定时器第一次触发的时间, 启动延时时间 5 ms
	Timer1_Pulse_it.it_value.tv_nsec = 5 * 1000 * 1000;
	Timer1_Pulse_it.it_interval.tv_sec = 0;								  // timer周期
	Timer1_Pulse_it.it_interval.tv_nsec = EvensTimerPeriod * 1000 * 1000; // 10 ms, 纳秒,微秒,毫秒,秒
	/*结束配置一个Poisix timer*/

	res = timer_settime(TimerPulse, 0, &Timer1_Pulse_it, NULL);
	if (res)
	{
		perror("TimerPulse settime Error");
		return;
	}
}

int main() {
    // startTimer();
    EventSaverTimerInit();

    // 主线程继续执行其他操作
    for (int i = 0; i < 100; ++i) {
        // std::cout << "Main thread doing work: " << i << std::endl;
        std::this_thread::sleep_for(std::chrono::seconds(1));
    }
    // 关闭glog
    google::ShutdownGoogleLogging();
    return 0;
}

编译

g++ test.cpp -lrt -lglog
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Linux 下使用 C 编程语言实现定时器可以通过使用 POSIX 定时器库来实现。 首先,你需要包含头文件 `time.h` 和 `signal.h`: ```c #include <time.h> #include <signal.h> ``` 然后,定义一个全局变量来存储定时器 ID: ```c timer_t timerid; ``` 接下来,你可以编写一个处理定时器信号的函数,例如: ```c void timer_handler(int signum) { // 处理定时器触发事件 } ``` 在主函数中,你需要创建一个定时器,并设置它的属性和定时器处理函数: ```c int main() { struct sigevent sev; struct itimerspec its; struct sigaction sa; // 定义定时器处理函数 sa.sa_flags = SA_SIGINFO; sa.sa_sigaction = timer_handler; sigemptyset(&sa.sa_mask); sigaction(SIGRTMIN, &sa, NULL); // 创建定时器 sev.sigev_notify = SIGEV_SIGNAL; sev.sigev_signo = SIGRTMIN; sev.sigev_value.sival_ptr = &timerid; timer_create(CLOCK_REALTIME, &sev, &timerid); // 设置定时器属性 its.it_value.tv_sec = 1; // 第一次触发的秒数 its.it_value.tv_nsec = 0; // 第一次触发的纳秒数 its.it_interval.tv_sec = 1; // 以后每次触发的间隔秒数 its.it_interval.tv_nsec = 0; // 以后每次触发的间隔纳秒数 // 启动定时器 timer_settime(timerid, 0, &its, NULL); // 循环等待定时器触发事件 while (1) { // ... } return 0; } ``` 以上代码中,`timer_create()` 函数用于创建一个定时器,`timer_settime()` 函数用于启动定时器。你可以根据实际需求修改定时器触发时间和间隔。 当定时器触发时,`timer_handler()` 函数将被调用,你可以在该函数中编写处理定时器事件的代码。 这只是一个简单的示例,你可以根据你的具体需求进行更复杂的定时器操作。希望这个回答能对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值