我想调用一个函数,让我们说每10或20秒。当我搜索时,我到处想出了线程和sleep()
方法。
我还检查了C中的时间和时钟类,但我找不到任何有用的问题。
定期调用函数的最简单方法是什么?
答案 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()当然会阻止:)