2011-04-27 3 views
3

내 C++ 프로그램에서 매초마다 한 번 호출되는 함수를 만들고 싶습니다. 어떻게해야합니까?주기적으로 호출되는 C++ 함수

OSX에서 쉘을 만들고 있습니다. 리눅스에서도 똑같이 작동해야합니다. 이 함수의 목적은 생성 된 프로그램을 감시하고 너무 많은 메모리 또는 CPU 시간을 사용하여 시작할 때 종료하는 것입니다.

+1

질문에 더 많은 맥락을 제공 할 수 있습니까? 이것은 명령 행 프로그램과 마찬가지로 또는 GUI 프로그램입니까? 프로그램이 사용자 이벤트 (예 : 키보드 이벤트)에 응답해야합니까? 어떤 운영 체제를 타겟팅하고 있습니까? 왜 함수를 주기적으로 호출해야합니까? 그게 무슨 일입니까? –

+2

이 함수는 문제가 아닙니다. 모든 기능은 주기적으로 호출 할 수 있습니다. 주어진 간격으로 함수를 호출하는 스레드와 같은 것이 필요합니다. – tgmath

+1

이 플랫폼에서 어떤 플랫폼을 사용하는지 알면 도움이 될 것입니다. 예를 들어 유닉스 계열 시스템에서는 함수를'SIGALRM '에 대한 핸들러에 넣고 알람 신호를 요청할 수 있습니다. 비슷한 옵션이 Windows에 있다고 확신합니다. –

답변

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() ; 
    } 
} 
+0

정확한 1Hz 타이밍을 원하면 sleep (1)을 usleep (1000000-delta)로 변경해야합니다. 여기서 delta는 경과 시간입니다 이전 수면이 끝난 이후. –

3

부스트를 사용하는 경우 부스트 타이머 기능을 사용하여 주기적으로 호출되는 콜백을 등록 할 수 있습니다.
보십시오 here :

각 플랫폼에서 제공하는 타이머 기능을 사용할 수도 있지만 이식 할 수는 없습니다. 게다가 당신은 haplvent 특정 platfrom 중 하나를 언급했다.

편집 : 당신이 맥 OS X를 사용하고 있기 때문에, 아마 당신은 this
난 그냥 빠른 구글 검색은 특정 플랫폼해야하기 때문에 &가 리눅스에 대한 작동이 그나마 것을 보여줍니다,하지만 그것을 사용를 havent 사용할 수 있습니다.

+0

OSX에 있다면 무엇을 사용합니까? 여전히 Linux에서도 작동합니까? –

1

루프는 우선 순위가 높은 스레드를 만들 수 있지만 각 루프 사이에 두 번째 잠을 듭니다.

3

posix 스레드 (<pthread.h>)와 sleep/clock_nanosleep (<time.h>)을 사용할 수 있습니다. 당신은 무엇 이것에 대해 여러 스레드, 필요하지 않으면 POSIX API는 리눅스와 맥 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

이것을 사용하면 프로그램이 어떻게 다른 작업을 수행 할 수 있습니까? –

+0

당신이 그것을 원한다는 것을 알지 못했습니다 :-) – nielsbot

관련 문제