【问题标题】:Running a while loop for 10 seconds [duplicate]运行一个while循环10秒[重复]
【发布时间】:2020-05-15 07:56:39
【问题描述】:

我需要在 C 中运行一个 while 循环恰好 10 秒。我试过这个:

clock_t start = clock();

while( ( clock() - start ) < ( 10 * CLOCKS_PER_SEC ) ) {

work..

}

但它不起作用。

【问题讨论】:

  • CLOCKS_PER_SECOND 应该是CLOCKS_PER_SEC
  • @AdrianMole 哦,它是 CLOCKS_PER_SEC 而不是 CLOCKS_PER_SECOND 但我在这里写错了。对不起。仍然 CLOCKS_PER_SEC 不起作用。
  • 你能更详细地描述一下“不工作”吗?我试过你的代码(在循环体中插入一个简单的printf 语句)并且效果很好。 (MSVC,Windows 10)。
  • clock() 可能会返回 -1 以指示不可用。无论如何,clock() 测量处理器时间;等待网络(键盘、磁盘等)活动所花费的时间不是处理器时间。如果您可以使用 POSIX,请尝试clock_gettime()
  • @tr1umph 我看到你是 stackoverflow 的新手。该站点适用于声誉点。当有人以答案的形式向您提供有用的信息时,您通常应该检查最佳答案作为已接受的答案,或者对一些对您有帮助的答案进行投票。这样,花时间帮助您的人可以获得一些声誉积分。这里真的只是命令礼貌。我查过你的历史。你没有接受一个答案。尽管有些人发布了对您有帮助的答案。

标签: c linux ubuntu


【解决方案1】:

请说明 什么 不起作用。我猜:

在 Debian 10 上,正确的宏是 CLOCKS_PER_SEC。但也许 Ubuntu 添加了 CLOCKS_PER_SECOND 作为别名,在这种情况下,这不是您遇到的问题。

按照您实现计时器的方式,您可以循环超过 10 秒(如果您的“工作”时间不是 10 秒的除数)。 如果这是您的实际问题,您应该检查异步任务和信号。 这样,您可以让一个进程(或线程)在无限循环中进行初始工作,而第二个进程在 10 秒后通知第一个进程(例如使用信号)。但这需要更复杂的代码!

我希望我能给你带来一些帮助,但如果我没有尝试更准确地回答你的问题。

【讨论】:

    【解决方案2】:

    看起来你可能真正想要的是一个实际的计时器,以便在指定的时间间隔过去时调用一个函数。在该函数中,您可以处理断开客户端与服务器的连接。

    见:https://programming.vip/docs/linux-c-language-timer.html

    您应该能够根据需要修改此示例:

    #include<stdio.h>
    #include<signal.h>
    #Include<sys/time.h>//itimerval structure definition
    
    int handle_count=0;
    void set_time(void)
    {
       struct itimerval itv;
       itv.it_interval.tv_sec=10;//Load automatically and then respond every 10 seconds
       itv.it_interval.tv_usec=0;
       itv.it_value.tv_sec=5;//Time of First Timing
       itv.it_value.tv_usec=0;
       setitimer(ITIMER_REAL,&itv,NULL);
    }
    
    void alarm_handle(int sig)
    {
       handle_count++;
       printf("have handle count is %d\n",handle_count);
    }
    
    void main(void)
    {
       struct itimerval itv;
       signal(SIGALRM,alarm_handle);
       set_time();
    
       while(1){
       getitimer(ITIMER_REAL,&itv);
       printf("pass second is %d\n",(int)itv.it_value.tv_sec);
       sleep(1);
       }
    
       return;
    }
    

    一些手册页链接:

    另一个 StackOverflow answer 的示例:

    #include <stdio.h>
    #include <stdlib.h>
    #include <signal.h>
    #include <time.h>
    #include <unistd.h>
    
    static unsigned int pass_value_by_pointer = 42;
    
    void Timer_has_expired(union sigval timer_data)
    {
        printf("Timer expiration handler function; %d\n", *(int *) timer_data.sival_ptr);
    }
    
    int main(void)
    {
        struct sigevent timer_signal_event;
        timer_t timer;
    
        struct itimerspec timer_period;
    
        printf("Create timer\n");
        timer_signal_event.sigev_notify = SIGEV_THREAD;
        timer_signal_event.sigev_notify_function = Timer_has_expired;       // This function will be called when timer expires
        // Note that the following is a union. Assign one or the other (preferably by pointer)
        //timer_signal_event.sigev_value.sival_int = 38;                        // This argument will be passed to the function
        timer_signal_event.sigev_value.sival_ptr = (void *) &pass_value_by_pointer;     // as will this (both in a structure)
        timer_signal_event.sigev_notify_attributes = NULL;
        timer_create(CLOCK_MONOTONIC, &timer_signal_event, &timer);
    
        printf("Start timer\n");
        timer_period.it_value.tv_sec = 1;                                   // 1 second timer
        timer_period.it_value.tv_nsec = 0;                                  // no nano-seconds
        timer_period.it_interval.tv_sec = 0;                                // non-repeating timer
        timer_period.it_interval.tv_nsec = 0;
    
        timer_settime(timer, 0, &timer_period, NULL);
        sleep(2);
    
        printf("----------------------------\n");
        printf("Start timer a second time\n");
        timer_settime(timer, 0, &timer_period, NULL);
        sleep(2);
    
        printf("----------------------------\n");
        printf("Start timer a third time\n");
        timer_settime(timer, 0, &timer_period, NULL);
    
        printf("Cancel timer\n");
        timer_delete(timer);
        sleep(2);
        printf("The timer expiration handler function should not have been called\n");
    
        return EXIT_SUCCESS;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-23
      • 1970-01-01
      • 2014-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多