2013-02-12 14 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