定期调用函数而不使用c中的thread和sleep()方法

时间:2013-02-12 12:03:19

标签: c

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

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

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

5 个答案:

答案 0 :(得分:4)

大多数操作系统都有办法“设置闹钟”或“设置闹钟”,这将在未来的某个时间调用你的功能。在linux中,您使用alarm,在Windows中使用SetTimer

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

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

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

问题以一种非常直接的方式解决,以解决问题,并使其易于处理。

答案 1 :(得分: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;
}

答案 2 :(得分: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期间它将被调用多次。

答案 3 :(得分:1)

试试这个:

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

这是Java-Syntax,我从未编程c超过5年,但也许它可以帮助你:)

答案 4 :(得分:0)

简单:

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

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

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