在我的c ++程序中,我想创建一个定期调用的函数,比如每秒一次。我怎么能这样做?
我在OSX中创建一个shell。它在Linux中也应该是一样的。此函数的目的是观察生成的程序,并在它们开始使用太多内存或CPU时间时终止它们。
答案 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") ;
}
}