Функция C ++, которая периодически вызывается - PullRequest
3 голосов
/ 27 апреля 2011

В моей программе на С ++ я хочу создать функцию, которая вызывается периодически, как раз в секунду.Как я могу это сделать?

Я создаю оболочку в OSX.Это должно также работать в Linux.Цель этой функции - отслеживать порожденные программы и завершать их, когда они начинают использовать слишком много памяти или процессорного времени.

Ответы [ 6 ]

4 голосов
/ 27 апреля 2011

Хорошо, вот вам решение.Кто-то может захотеть проверить правильность использования моего 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( ) ;
    }   
}
3 голосов
/ 27 апреля 2011

Вы можете использовать потоки posix (<pthread.h>) и sleep / clock_nanosleep (<time.h>).POSIX API поддерживается всеми unixes, включая Linux и Mac OS X.

3 голосов
/ 27 апреля 2011

Если вы используете Boost, вы можете использовать функцию Boost Timer для регистрации обратных вызовов, которые периодически вызываются.
Посмотрите здесь :

Вы также можете использовать функции таймера, предоставляемые каждой платформой, но это будет непереносимо. Кроме того, вы не упомянули какой-либо конкретной платформы от.

РЕДАКТИРОВАТЬ: Поскольку вы используете Mac OS X, возможно, вы можете использовать это
Хотя я не использовал его, просто быстрый поиск в Google показывает, что он не будет работать для Linux, потому что он должен зависеть от платформы.

1 голос
/ 27 апреля 2011

Если вам не нужны несколько потоков, что по этому поводу:

#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") ;
    }
}
1 голос
/ 27 апреля 2011

Вы можете просто создать высокоприоритетный поток, который зацикливается, но тратит секунду на сон между циклами.

1 голос
/ 27 апреля 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...