我想为以下事件注册处理程序:"系统时钟计时器增加第二个计数器"。是否可以为此事件附加处理程序?换句话说,我想每秒调用一个合适的函数。似乎以下解决方案非常糟糕:
#include <ctime>
bool checkTimer(int sec_now)
{
time_t t= time(0);
int sec=localtime(&t)->tm_sec;
if(sec_now!=sec)
return true;
return false;
}
void callback()
{
//handler
}
int main()
{
while(true)
{
time_t t= time(0);
int sec_now=localtime(&t)->tm_sec;
while(!checkTimer(sec_now)){ }
callback();
}
}
此代码可以按我的意思运行。但我认为这是不好的方式。你能提出另一种方法吗?我使用linux mint 14。
答案 0 :(得分:0)
此代码可以按我的意思运行。但我认为这是不好的方式。
此实现的问题在于程序忙于循环:它占用一个核心上的所有CPU时间。有几种方法可以在Linux上实现间隔计时器。例如,您可以查看 timerfd 。
#include <iostream>
#include <inttypes.h>
#include <sys/timerfd.h>
#include <unistd.h>
void callback(void)
{
std::cout << "callback()" << std::endl;
}
int main(void)
{
int tfd;
uint64_t count;
// Interval timer that expires every 1 second
struct itimerspec timer = {
.it_interval = {1, 0}, // interval for periodic timer
.it_value = {1, 0}, // initial expiration
};
tfd = timerfd_create(CLOCK_MONOTONIC, 0);
timerfd_settime(tfd, 0, &timer, NULL);
while (true) {
read(tfd, &count, sizeof(count));
callback();
}
close(tfd);
return 0;
}