2011-04-27 32 views
3

在我的C++程序中,我想製作一個定期調用的函數,就像每秒調用一次。我怎樣才能做到這一點?一個定期調用的C++函數

我在OSX中創建一個shell。它在Linux中也應該是一樣的。此功能的目的是觀察衍生的程序,並在開始使用太多內存或CPU時間時終止它們。

+1

你能提供更多的上下文嗎?就像這是一個命令行程序,還是它是一個GUI程序?該程序是否需要響應用戶事件(例如鍵盤事件)?你的目標是什麼操作系統?爲什麼你需要定期調用一個函數?它的任務是什麼? – 2011-04-27 07:50:30

+2

該功能不是問題。每個函數都可以定期調用。您需要像在特定時間間隔內調用該函數的線程。 – tgmath 2011-04-27 07:53:01

+1

它肯定會幫助你知道你在做什麼平臺。例如,在一個類似Unix的系統上,你可以將你的函數放在'SIGALRM'的處理程序中並請求報警信號。我確定Windows上有類似的選項。 – 2011-04-27 07:57:30

回答

4

好了 - 這裏有一個並行線程解決方案。有人可能想檢查我的pthread API的使用是否正確,但我驗證了這一點:

#include <stdio.h> 
#include <pthread.h> 

#define false (0!=0) 
static void * TimerRoutine(void *) ; 

int main(int argc, const char ** argv) 
{ 
    pthread_t thread ; 
    pthread_attr_t attr ; 

    pthread_attr_init(& attr) ; 
    pthread_create(& thread, & attr, TimerRoutine, NULL) ; 

    int done = false ; 
    while(!done) 
    { 
     char input[80] ; 
     scanf("%79s", input) ; 
     // handle input command (or something) 

     done = (0 == strcmp(input, "quit")) ; 
    } 

    // wait for timer thread to exit 
    pthread_cancel(thread) ; 
    pthread_join(thread, NULL) ; 
} 

static void * TimerRoutine(void * arg) 
{ 
    pthread_detach(pthread_self()) ; 

    int done = false ; 
    while(!done) 
    { 
     // do background task, i.e.: 
     printf("tick!\n") ; 
     sleep(1) ; 

     pthread_testcancel() ; 
    } 
} 
+0

注意,如果你想精確的1Hz定時睡眠(1)將需要改變爲一個睡眠(1000000三角洲),其中三角洲是經過的時間自上一次睡眠結束以來。 – 2014-02-14 09:43:12

3

如果您正在使用Boost,您可以使用Boost Timer功能來註冊定期調用的回調函數。
看一看here

您也可以使用每個平臺提供的計時器功能,但這是不可移植的。除此之外你還沒有提到任何特定的平臺。

編輯:既然你使用的是Mac OS X,也許你可以使用this
我雖然還沒有使用過它,只是一個快速谷歌搜索顯示,&不這樣它會爲Linux的工作,因爲它必須是特定的平臺。

+0

如果我在OSX中,我會用什麼?它仍然可以在Linux上工作嗎? – 2011-04-27 08:15:26

1

你可以創建一個高優先級的線程,循環但在每個循環之間休息一秒鐘。

3

您可以使用posix線程(<pthread.h>)和sleep/clock_nanosleep(<time.h>)。 POSIX API由所有的Unix包括Linux和Mac OS X.

1

支持。如果你不需要多線程,你看這個:

#include <stdio.h> 

#define false (0!=0) 

int main(int argc, const char ** argv) 
{ 
    int done = false ; 
    while(!done) 
    { 
     // check for rogue processes here 

     sleep(1) ; 
     printf("tick!\n") ; 
    } 
} 
+0

如果使用了這個,那麼程序如何做其他事情? – 2011-04-27 09:20:33

+0

它不能 - 你不知道你想要那個:-) – nielsbot 2011-04-27 09:24:12