C 我是否需要一个单独的线程来为主程序中的while循环设置计时器?

C 我是否需要一个单独的线程来为主程序中的while循环设置计时器?,c,timer,C,Timer,我想在指定的时间内运行一个循环,但现在我所能想到的就是创建一个基于计时器的线程,并使用一个信号来告诉主函数它何时结束 要求是,当感兴趣的对象在整个环境中移动时,我希望能够设置一个特定的毫秒计时器。假设我知道速度,但没有位置反馈,我可以预测我的位置。 (即以5 rad/s的速度旋转,确定旋转90度所需的时间) 也许类似于下面的假设程序 static sem_t timerSem; static bool timerExp; pthread_t th_timer; static void ti

我想在指定的时间内运行一个循环,但现在我所能想到的就是创建一个基于计时器的线程,并使用一个信号来告诉主函数它何时结束

要求是,当感兴趣的对象在整个环境中移动时,我希望能够设置一个特定的毫秒计时器。假设我知道速度,但没有位置反馈,我可以预测我的位置。 (即以5 rad/s的速度旋转,确定旋转90度所需的时间)

也许类似于下面的假设程序

static sem_t timerSem;  
static bool timerExp;
pthread_t th_timer;

static void timersignaldhandler()
{
    sem_post(&timerSem);
}

void *th_timer(void *)
{
      while(!timer_stopped){
            int rc = sem_wait(&timerSem);
            timer_func();
      }
}
void shutdown_timer() 
{
    timerExp = true;
    sem_post(&timerSem);
    pthread_join(th_timer, 0);
}
void timer_func() 
{
    //sleep for x mS

    //Shutdown
    shutdown_timer();
    sem_post(&demo_over);   // signal main thread to exit
}
move()
{
     //Move command
}
int main(int argc, char **argv)
{    
     timerExp = false;
     pthread_create(&th_timer, NULL, th_timer, NULL);


     while(!timerExp)
     {
           move();
     }
}

这是理想的方法吗?我需要一个单独的计时器线程吗?

我认为你不需要单独的线程

为什么不这样做呢,这个程序将运行30秒

int t =  time(NULL);
int i = 0;
while(t+30 > time(NULL)) {
   ++i;
   // or do whatever in here
}

alarm()
系统调用允许您将SIGALRM设置为以整数秒显示,而不需要第二个线程。有次秒的等价物可用,也可以说服它生成SIGALRM。不要尝试同时使用
alarm()
setitimer()
;行为是未定义的。虽然这在几秒钟内有效,但OP在他的问题中提到了几毫秒。这通常不是一个好的做事方式。有几个问题。它会导致一种形式的忙等待(如果“做任何事情”代码中没有任何内容,那么它会在没有做任何有用的事情的情况下对CPU施加压力)。相反,如果“做任何事”代码花费的时间太长(很多秒,可能是因为它在等待网络消息),则在30秒之前的迭代与30秒之后的时间超过30秒之间可能存在很长的间隔。应该可以工作,特别是在更正了对“time()”的两个调用之后'正确的格式是:'time_t=time(NULL);'。使用建议的方法,程序将运行30到31秒。@JonathanLeffler你是对的,但我只是给他指出了正确的方向。这种方法不会减慢while循环中的进程吗?这能达到1ms的精度吗?