我想调用一个函数,可以说每10或20秒。当我搜索时,我想出了各种线程和sleep()
方法。定期调用函数而不使用线程和睡眠()方法c
我也检查了时间和时钟类在C中,但我找不到任何有用的具体到我的问题。
什么是定期调用函数最简单的方法?
我想调用一个函数,可以说每10或20秒。当我搜索时,我想出了各种线程和sleep()
方法。定期调用函数而不使用线程和睡眠()方法c
我也检查了时间和时钟类在C中,但我找不到任何有用的具体到我的问题。
什么是定期调用函数最简单的方法?
使用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;
}
我有错误:event.h:没有这样的文件或目录,我应该怎么做,你认为? – 2013-02-12 15:47:53
你必须安装libevent,并在编译阶段连接它 – 2013-02-12 16:12:53
看来这个'say_hello()'只在我的操作系统CentOS6.5-32bit上运行一次。 – CodyChan 2016-11-29 02:20:36
大多数操作系统都有一种“设置闹钟”或“设置定时器”的方法,它将在未来的特定时间调用您的功能。在linux中,你会使用alarm
,在Windows中你会使用SetTimer
。
这些函数对被调用的函数做了什么限制,而且几乎可以肯定最终会有最终有多个线程的东西 - 尽管线程可能不会调用sleep
,但有些wait_for_event
或者相似的功能。
编辑:但是,使用一个线程与包含线程:
while(1)
{
sleep(required_time);
function();
}
的问题是解决问题的一个非常直接的方式解决,使得它很容易处理。
+1,并且通过alarm/setitimer,您可以获得异步信号安全限制的所有“乐趣”,所以如果使用此方法,则此函数可以执行的操作并不多。 – 2013-02-12 12:15:16
一个天真的解决办法是这样的:
/* 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-12 12:12:18
由于'%'需要整数操作数,因此'time_t'为浮点类型的实现将无法使用。 – Jens 2013-02-12 12:19:02
@MatsPetersson当然。我认为这是一个天真的解决方案。 :) – 2013-02-12 12:35:50
试试这个:
while(true) {
if(System.getNanotime % 20 == 0) {
myFunction();
}
}
这是Java的语法,我没有方案C,因为5年以上,但也许它可以帮助你:)
简单:
#include <stdio.h>
#include <unistd.h>
int main(int argc, const char** argv)
{
while(1)
{
usleep(20000) ;
printf("tick!\n") ;
}
}
请注意,usleep()当然会阻止:)
简单搜索发现[这个](http://stackoverflow.com/questions/3557221/how-do-i-measure-time-in-c)。 – 2013-02-12 12:05:41
你为什么排除线程/睡眠?这听起来像是“我想要做'X',但没有做'插入到'X']的好方法”的问题。 – JasonD 2013-02-12 12:06:25
最简单的方法是while(1){sleep(10);功能(); }',所以你应该指定'sleep'有什么问题(对于“不使用睡眠”的要求,我们有很多替代方法基本上是一样的)。 – 2013-02-12 12:06:37