2013-02-12 15 views
2

我想调用一个函数,可以说每10或20秒。当我搜索时,我想出了各种线程和sleep()方法。定期调用函数而不使用线程和睡眠()方法c

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

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

+1

简单搜索发现[这个](http://stackoverflow.com/questions/3557221/how-do-i-measure-time-in-c)。 – 2013-02-12 12:05:41

+3

你为什么排除线程/睡眠?这听起来像是“我想要做'X',但没有做'插入到'X']的好方法”的问题。 – JasonD 2013-02-12 12:06:25

+0

最简单的方法是while(1){sleep(10);功能(); }',所以你应该指定'sleep'有什么问题(对于“不使用睡眠”的要求,我们有很多替代方法基本上是一样的)。 – 2013-02-12 12:06:37

回答

4

使用libevent,在我看来,是th Ë清晰的解决方案,因为在此期间,你可以做其他操作(甚至其他定时功能)

看看这个简单的自我解释的例子,打印出您好每3秒:

#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; 
} 
+0

我有错误:event.h:没有这样的文件或目录,我应该怎么做,你认为? – 2013-02-12 15:47:53

+0

你必须安装libevent,并在编译阶段连接它 – 2013-02-12 16:12:53

+0

看来这个'say_hello()'只在我的操作系统CentOS6.5-32bit上运行一次。 – CodyChan 2016-11-29 02:20:36

4

大多数操作系统都有一种“设置闹钟”或“设置定时器”的方法,它将在未来的特定时间调用您的功能。在linux中,你会使用alarm,在Windows中你会使用SetTimer

这些函数对被调用的函数做了什么限制,而且几乎可以肯定最终会有最终有多个线程的东西 - 尽管线程可能不会调用sleep,但有些wait_for_event或者相似的功能。

编辑:但是,使用一个线程与包含线程:

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

的问题是解决问题的一个非常直接的方式解决,使得它很容易处理。

+0

+1,并且通过alarm/setitimer,您可以获得异步信号安全限制的所有“乐趣”,所以如果使用此方法,则此函数可以执行的操作并不多。 – 2013-02-12 12:15:16

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是真的被多次调用。

+0

如果时间捕捉不是每秒都在发生(至少),那么这具有“缺失”的缺点。举例来说,如果我们有用户输入... – 2013-02-12 12:12:18

+0

由于'%'需要整数操作数,因此'time_t'为浮点类型的实现将无法使用。 – Jens 2013-02-12 12:19:02

+0

@MatsPetersson当然。我认为这是一个天真的解决方案。 :) – 2013-02-12 12:35:50

1

试试这个:

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

这是Java的语法,我没有方案C,因为5年以上,但也许它可以帮助你:)

0

简单:

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

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

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

+0

由于丢失,无法编译。为什么人们((真))或(1)简单的时候如此着迷?(?;)会做什么? – Jens 2013-02-12 12:21:17

+2

固定。毕竟,这是一个品味问题。 – kfunk 2013-02-12 12:23:23

+0

每个对布尔表达式中的常数都有好感的人都需要重新评估味道:-)我的lint标记了他们,这是正确的。他们很丑陋。 – Jens 2013-02-12 16:04:36