定期调用的c ++函数

时间:2011-04-27 07:49:23

标签: c++ function

在我的c ++程序中,我想创建一个定期调用的函数,比如每秒一次。我怎么能这样做?

我在OSX中创建一个shell。它在Linux中也应该是一样的。此函数的目的是观察生成的程序,并在它们开始使用太多内存或CPU时间时终止它们。

6 个答案:

答案 0 :(得分:4)

好的 - 这是一个pthread解决方案。有人可能想检查我的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( ) ;
    }   
}

答案 1 :(得分:3)

如果您正在使用Boost,您可以使用Boost Timer功能来注册定期调用的回调。
看看here

您还可以使用每个平台提供的计时器功能,但这将是不可移植的。除此之外,你还没有提到任何具体的平台。

编辑:由于您使用的是Mac OS X,也许可以使用this
      我没有使用它,只是一个快速谷歌搜索显示&amp;这不适用于Linux,因为它必须是特定于平台的。

答案 2 :(得分:3)

您可以使用posix线程(<pthread.h>)和sleep / clock_nanosleep(<time.h>)。所有unix都支持POSIX API,包括Linux和Mac OS X.

答案 3 :(得分:1)

答案 4 :(得分:1)

您可以创建一个循环高优先级的线程,但在每个循环之间花费第二个睡眠。

答案 5 :(得分: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") ;
    }
}
相关问题