c - 在不使用 sleep 的情况下定期运行一段代码

标签 c linux windows

我有一个函数,它会在特定时间间隔调用。我需要检查之前调用的时间和当前时间。如果函数调用之间的差异是 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/

相关文章:

c - 按执行顺序列出函数

c - 静态函数如何在内部映射?

c - 将列表传递给函数以在 C 中用可变数量的成员填充列表

java - 从文件夹制作jar文件

c - 从另一个 exe 运行 exe

c++ - C 引用 C++ extern

c - 使用 DMA 提高 SPI6 的性能

linux - 如何检查应用程序是否在服务器中启动并运行?

linux - 汇编程序编译时遇到的问题

windows - 在 Weblogic 中使用本地版本的 ANT 和 JUNIT 运行 ant build