내 C++ 프로그램에서 매초마다 한 번 호출되는 함수를 만들고 싶습니다. 어떻게해야합니까?주기적으로 호출되는 C++ 함수
OSX에서 쉘을 만들고 있습니다. 리눅스에서도 똑같이 작동해야합니다. 이 함수의 목적은 생성 된 프로그램을 감시하고 너무 많은 메모리 또는 CPU 시간을 사용하여 시작할 때 종료하는 것입니다.
내 C++ 프로그램에서 매초마다 한 번 호출되는 함수를 만들고 싶습니다. 어떻게해야합니까?주기적으로 호출되는 C++ 함수
OSX에서 쉘을 만들고 있습니다. 리눅스에서도 똑같이 작동해야합니다. 이 함수의 목적은 생성 된 프로그램을 감시하고 너무 많은 메모리 또는 CPU 시간을 사용하여 시작할 때 종료하는 것입니다.
확인을 - 여기 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() ;
}
}
정확한 1Hz 타이밍을 원하면 sleep (1)을 usleep (1000000-delta)로 변경해야합니다. 여기서 delta는 경과 시간입니다 이전 수면이 끝난 이후. –
Boost.Asio은 timers입니다.
부스트를 사용하는 경우 부스트 타이머 기능을 사용하여 주기적으로 호출되는 콜백을 등록 할 수 있습니다.
보십시오 here :
각 플랫폼에서 제공하는 타이머 기능을 사용할 수도 있지만 이식 할 수는 없습니다. 게다가 당신은 haplvent 특정 platfrom 중 하나를 언급했다.
편집 : 당신이 맥 OS X를 사용하고 있기 때문에, 아마 당신은 this
난 그냥 빠른 구글 검색은 특정 플랫폼해야하기 때문에 &가 리눅스에 대한 작동이 그나마 것을 보여줍니다,하지만 그것을 사용를 havent 사용할 수 있습니다.
OSX에 있다면 무엇을 사용합니까? 여전히 Linux에서도 작동합니까? –
루프는 우선 순위가 높은 스레드를 만들 수 있지만 각 루프 사이에 두 번째 잠을 듭니다.
posix 스레드 (<pthread.h>
)와 sleep/clock_nanosleep (<time.h>
)을 사용할 수 있습니다. 당신은 무엇 이것에 대해 여러 스레드, 필요하지 않으면 POSIX API는 리눅스와 맥 OS X의
포함한 모든 유닉스에 의해 지원됩니다
#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") ;
}
}
이것을 사용하면 프로그램이 어떻게 다른 작업을 수행 할 수 있습니까? –
당신이 그것을 원한다는 것을 알지 못했습니다 :-) – nielsbot
질문에 더 많은 맥락을 제공 할 수 있습니까? 이것은 명령 행 프로그램과 마찬가지로 또는 GUI 프로그램입니까? 프로그램이 사용자 이벤트 (예 : 키보드 이벤트)에 응답해야합니까? 어떤 운영 체제를 타겟팅하고 있습니까? 왜 함수를 주기적으로 호출해야합니까? 그게 무슨 일입니까? –
이 함수는 문제가 아닙니다. 모든 기능은 주기적으로 호출 할 수 있습니다. 주어진 간격으로 함수를 호출하는 스레드와 같은 것이 필요합니다. – tgmath
이 플랫폼에서 어떤 플랫폼을 사용하는지 알면 도움이 될 것입니다. 예를 들어 유닉스 계열 시스템에서는 함수를'SIGALRM '에 대한 핸들러에 넣고 알람 신호를 요청할 수 있습니다. 비슷한 옵션이 Windows에 있다고 확신합니다. –