2

我想调用一个函数,假设每 10 或 20 秒一次。sleep()当我搜索时,我到处都想出了线程和方法。

我还检查了 C 中的时间和时钟类,但我找不到任何对我的问题有帮助的东西。

定期调用函数的最简单方法是什么?

4

5 回答 5

4

在我看来,使用libevent是更清洁的解决方案,因为与此同时,您可以执行其他操作(甚至是其他定时功能)

看看这个每 3 秒打印一次 Hello 的简单且自我解释的示例:

#include <stdio.h>
#include <sys/time.h>
#include <event.h>

void say_hello(int fd, short event, void *arg)
{
  printf("Hello\n");
}

int main(int argc, const char* argv[])
{
  struct event ev;
  struct timeval tv;

  tv.tv_sec = 3;
  tv.tv_usec = 0;

  event_init();
  evtimer_set(&ev, say_hello, NULL);
  evtimer_add(&ev, &tv);
  event_dispatch();

  return 0;
}
于 2013-02-12T12:16:36.247 回答
4

大多数操作系统都有“设置警报”或“设置计时器”的方法,这将在未来的给定时间调用您的函数。在 linux 中,您将使用alarm,在 Windows 中,您将使用SetTimer.

这些函数对你在被调用的函数中可以做什么有限制,而且你几乎肯定最终会得到一个有多个线程的东西——尽管线程可能不是在调用sleep,而是一些wait_for_event或类似的函数。

编辑:但是,使用包含以下线程的线程:

while(1) 
{
   sleep(required_time); 
   function(); 
}

问题以一种非常直接的方式解决了问题,并且非常容易处理。

于 2013-02-12T12:06:51.843 回答
1

尝试这个:

while(true) {
   if(System.getNanotime % 20 == 0) {
      myFunction();
   } 
}

这是在 Java 语法中,我已经 5 年多没有编程 c 了,但也许它可以帮助你 :)

于 2013-02-12T12:08:56.560 回答
1

一个天真的解决方案是这样的:

/* Infinite loop */
time_t start_time = time(NULL);
for (;;)
{
    time_t now = time(NULL);

    time_t diff = now - start_time;

    if ((diff % 10) == 0)
    {
        /* Ten seconds has passed */
    }

    if ((diff % 20) == 0)
    {
        /* Twenty seconds has passed */
    }
}

您可能需要一个标志来指示该函数是否已被调用,或者它会在一秒钟内被调用多次(diff % 10) == 0为真。

于 2013-02-12T12:08:13.747 回答
0

简单的:

#include <stdio.h>
#include <unistd.h>

int main(int argc, const char** argv)
{
    while(1)
    {
        usleep(20000) ;
        printf("tick!\n") ;
    }
}

请注意, usleep() 当然会阻止:)

于 2013-02-12T12:09:31.080 回答