我想調用一個函數,可以說每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