#include <sys/time.h>
#include <stdio.h>
#include <pthread.h>
#include <functional>
#include <stdlib.h>
#include <unistd.h>
static long long last_timestap;
using std::placeholders::_1;
int work()
{
struct timeval time;
gettimeofday(&time,NULL);
printf("间隔=%lldus\n",((long long)(time.tv_sec*1000*1000 + time.tv_usec)-last_timestap));
last_timestap=time.tv_sec*1000*1000 + time.tv_usec;
}
void count(int c)
{
static int count_num=0;
count_num++;
if(count_num==10)
{
work();
count_num=0;
}
}
long long g_usec;
std::function<void(int)> g_func;
void startTimer(std::function<void(int)> func,int usec)
{
pthread_t th_t;
g_usec=usec;
g_func=func;
pthread_create(&th_t,NULL,[](void*)->void*{
for(;;)
{
usleep(g_usec-60);
g_func(1);
}
},NULL);
}
int main()
{
auto func=std::bind(count,_1);
startTimer(func,1*1000*1000);
for(;;){}
return 0;
}
带误差修正版本
#include <sys/time.h>
#include <stdio.h>
#include <pthread.h>
#include <functional>
#include <stdlib.h>
#include <unistd.h>
static long long last_timestap;
using std::placeholders::_1;
int work()
{
struct timeval time;
gettimeofday(&time,NULL);
printf("间隔=%lldus\n",((long long)(time.tv_sec*1000*1000 + time.tv_usec)-last_timestap));
last_timestap=time.tv_sec*1000*1000 + time.tv_usec;
}
void count(int c)
{
static int count_num=0;
count_num++;
if(count_num==10)
{
work();
count_num=0;
}
}
long long g_usec;
std::function<void(int)> g_func;
long long g_last=0;
long long g_timestap=0;
long long g_s_usec=0;
long long g_devi=200;
void startTimer(std::function<void(int)> func,int usec)
{
pthread_t th_t;
g_s_usec=usec;
g_func=func;
g_usec=usec;
pthread_create(&th_t,NULL,[](void*)->void*{
for(;;)
{
struct timeval time;
gettimeofday(&time,NULL);
g_last=time.tv_usec+time.tv_sec*1000*1000;
usleep(g_usec);
g_func(1);
gettimeofday(&time,NULL);
g_timestap=time.tv_usec+time.tv_sec*1000*1000;
if(g_timestap - g_last - g_usec > g_devi)
{
g_usec = g_usec - (g_timestap - g_last - g_usec);
}else{
g_usec=g_s_usec;
}
}
},NULL);
}
int main()
{
auto func=std::bind(count,_1);
startTimer(func,10*1000);
for(;;){}
return 0;
}