可以定义一个类来封装定时器的功能,并将其分别放在 `.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` 对象并开始定时器。
使用时需要注意信号的安全性和正确性。