2014-09-27 87 views
1

比方說,我的程序中有一些函數func(),我需要在某個特定的延遲後調用函數。到目前爲止,我GOOGLE了它,並結束了與如下因素代碼:linux C++如何在特定的時間間隔後調用函數

#include <stdio.h> 
#include <sys/time.h> /* for setitimer */ 
#include <unistd.h>  /* for pause */ 
#include <signal.h>  /* for signal */ 

void func() 
{ 
    printf("func() called\n"); 
} 

bool startTimer(double seconds) 
{ 
    itimerval it_val; 
    double integer, fractional; 

    integer = (int)seconds; 
    fractional = seconds - integer; 

    it_val.it_value.tv_sec = integer; 
    it_val.it_value.tv_usec = fractional * 1000000; 
    it_val.it_interval = it_val.it_value; 

    if (setitimer(ITIMER_REAL, &it_val, NULL) == -1) 
     return false; 

    return true; 
} 

int main() 
{ 
    if (signal(SIGALRM, (void(*)(int))func) == SIG_ERR) 
    { 
     perror("Unable to catch SIGALRM"); 
     exit(1); 
    } 

    startTimer(1.5); 

    while(1) 
     pause(); 

    return 0; 
} 

而且它的工作原理,但問題是,SetTimer的()導致FUNC()將與1.5秒的時間間隔重複調用。而我需要的是,只需調用func()一次。 有人能告訴我如何做到這一點?也許,我需要一些額外的參數settimer()?

注意:時間間隔應該是精確的,因爲此程序稍後會播放midi音樂。

+0

嚴重延遲有什麼問題? – 2014-09-27 17:05:16

+0

@ IgnacioVazquez-Abrams,如果你的意思是使用sleep()函數,那麼問題在於它不能提供精確的時間間隔,這對於播放音樂是不可接受的 – floppydisk 2014-09-27 17:09:42

+0

如何在'func()'中停止定時器? – dornhege 2014-09-27 17:11:42

回答

3

除非你需要該程序做其他事情,否則你可以簡單地睡覺分配的時間。

如果您需要使用鬧鐘,您可以安裝鬧鐘進行一次處理。

從手冊頁:

timeval結構it_interval

這是連續的定時器中斷之間的時間。如果爲零,則警報將只發送一次。

,而不是你的代碼:

it_val.it_interval = it_val.it_value; 

我會設置:

it_val.it_interval.tv_sec = 0; 
it_val.it_interval.tv_usec = 0; 

除了it_val.it_value您已設置。你所做的是對兩個結構使用相同的值,這就是爲什麼你會看到重複的間隔。

+0

哦,謝謝,我將間隔設置爲零,正如你所建議的,它工作:) – floppydisk 2014-09-27 17:15:43

相關問題