linux中创建一个循环定时器(C++)

可以定义一个类来封装定时器的功能,并将其分别放在 `.cpp` 和 `.h` 文件中。这里是一个简化的示例,展示了如何组织这些代码。

假设有一个 `Timer` 类,它负责创建和管理定时器。

Timer.h


#ifndef TIMER_H
#define TIMER_H

#include <signal.h>
#include <time.h>
#include <unistd.h>

class Timer {
public:
    Timer();
    ~Timer();

    void start();
    void stop();

private:
    static void timerCallback(int signum);
    static struct sigaction sa;
    static struct itimerspec its;
    static timer_t timerId;
};

#endif // TIMER_H
```

Timer.cpp



#include "Timer.h"

struct sigaction Timer::sa;
struct itimerspec Timer::its;
timer_t Timer::timerId;

Timer::Timer() {
    // 初始化定时器
    sa.sa_handler = Timer::timerCallback;
    sa.sa_flags = SA_RESTART;
    if (sigaction(SIGRTMIN, &sa, NULL) == -1) {
        perror("sigaction");
        exit(1);
    }

    struct sigevent sev;
    sev.sigev_notify = SIGEV_SIGNAL;
    sev.sigev_signo = SIGRTMIN;
    sev.sigev_value.sival_ptr = &Timer::timerId;
    if (timer_create(CLOCK_REALTIME, &sev, &Timer::timerId) == -1) {
        perror("timer_create");
        exit(1);
    }

    its.it_value.tv_sec = 1; // 初始延迟一秒
    its.it_value.tv_nsec = 0;
    its.it_interval.tv_sec = 1; // 每秒触发
    its.it_interval.tv_nsec = 0;
    if (timer_settime(Timer::timerId, 0, &its, NULL) == -1) {
        perror("timer_settime");
        exit(1);
    }
}

Timer::~Timer() {
    // 销毁定时器
    timer_delete(Timer::timerId);
}

void Timer::start() {
    while (true) {
        pause(); // 等待信号
    }
}

void Timer::stop() {
    // 停止定时器
    timer_settime(Timer::timerId, 0, &its, NULL);
}

void Timer::timerCallback(int signum) {
    static int count = 0;
    printf("Timer callback called! Count: %d\n", ++count);
}
```

main.cpp


#include "Timer.h"

int main() {
    Timer timer;
    timer.start();
    // 其他代码...
    return 0;
}
```

`Timer.h` 包含了 `Timer` 类的声明,`Timer.cpp` 实现了类的方法,包括定时器的创建、启动和停止,以及回调函数。`main.cpp` 中包含了主函数,它实例化 `Timer` 对象并开始定时器。

使用时需要注意信号的安全性和正确性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值