我有一个函数,它会在特定时间间隔调用。我需要检查之前调用的时间和当前时间。如果函数调用之间的差异是 10 毫秒,则执行一段代码。不应使用 sleep ,因为其他一些事情正在并行执行。我编写了以下代码,该函数每 10 毫秒调用一次,但我计算的不同之处在于有时会少 1 或 2 毫秒。计算差异的最佳方法是什么?
fxn()
{
int logCurTime;
static int logPrevTime = 0, logDiffTime = 0;
getCurrentTimeInMilliSec(&logCurTime);
if (logPrevTime > 0)
logDiffTime += logCurTime - logPrevTime;
if (logCurTime <= logPrevTime)
return;
if (logDiffTime >= 10)
{
...
...
logDiffTime = 0;
}
logPrevTime = logCurTime;
}
例如: fxn 被调用 10 次,间隔为 10 毫秒。某些实例 logDiffTime 仅为 8 或 9,下一个实例计算剩余时间。即 11 或 12。
最佳答案
使用sleep()
让代码在特定的时间间隔内执行确实是个坏主意。将您的函数注册为定时器中断的处理程序。然后它将非常准确地按时调用。
如果你在你的函数中做繁重的工作,那么你应该在另一个线程中做,因为当你的函数花费太长时间时你会遇到麻烦。 (它将再次从头开始调用)。
在 posix (linux) 中你可以这样做
#include <sys/time.h>
#include <stdio.h>
#include <signal.h>
if (signal (SIGALRM, fxn) == SIG_ERR)
perror ("Setting your function as timer handler failed");
unsigned seconds = 42;//your time
struct itimerval old, new_time;
new_time.it_interval.tv_usec = 0;
new_time.it_interval.tv_sec = 0;
new_time.it_value.tv_usec = 0;
new_time.it_value.tv_sec = (long int) seconds;
if (setitimer (ITIMER_REAL, &new_time, &old) != 0)
perror ("Setting the timer failed");
或在 Windows 中:
#include <Windows.h>
void Fxn_Timer_Proc_Wrapper(HWND,UINT,UINT_PTR,DWORD){
fxn();
}
unsigned seconds = 42;//your time
UINT_PTR timer_id;
if ( (timer_id = SetTimer(NULL,NULL,seconds *1000,(TIMERPROC) Fxn_Timer_Proc_Wrapper) == NULL){
//failed to create a timer
}
关于c - 在不使用 sleep 的情况下定期运行一段代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34509606/