Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在c+;中,每n秒调用一个函数最有效的方法是什么+;?_C++ - Fatal编程技术网

C++ 在c+;中,每n秒调用一个函数最有效的方法是什么+;?

C++ 在c+;中,每n秒调用一个函数最有效的方法是什么+;?,c++,C++,所以我试着每n秒调用一个函数。下面是我试图实现的一个简单表示。我想知道下面的方法是否是实现这一目标的唯一方法。如果可以避免“如果”的情况,我会很高兴 #include <stdio.h> #include <time.h> void print_hello(int i) { printf("hello\n"); printf("%d\n", i); } int main () { time_t start_t, end_t; double diff

所以我试着每n秒调用一个函数。下面是我试图实现的一个简单表示。我想知道下面的方法是否是实现这一目标的唯一方法。如果可以避免“如果”的情况,我会很高兴

#include <stdio.h>
#include <time.h>

void print_hello(int i) {
  printf("hello\n");
  printf("%d\n", i);
}

int main () {
   time_t start_t, end_t;
   double diff_t;

   time(&start_t);

   int i = 0;

   while(1) {
     time(&end_t);
     // printf("here in main");

     i = i + 1;
     diff_t = difftime(end_t, start_t);
     if(diff_t==5) {
        // printf("Execution time = %f\n", diff_t);
        print_hello(i);
        time(&start_t);
     }
   }

   return(0);
}
#包括
#包括
无效打印\你好(int i){
printf(“hello\n”);
printf(“%d\n”,i);
}
int main(){
时间开始,结束;
双差;
时间(和开始时间);
int i=0;
而(1){
时间(和结束时间);
//printf(“此处主要”);
i=i+1;
差异时间=差异时间(结束、开始);
如果(差异=5){
//printf(“执行时间=%f\n”,不同);
打印你好(i);
时间(和开始时间);
}
}
返回(0);
}

OPs程序中的时间使用可以减少到

// get tStart;
// set tEnd = tStart + x;
do {
  // get t;
} while (t < tEnd);

(我必须减少迭代次数和等待时间,以防止在线编译器中出现错误。)

阻止当前线程的执行,直到达到指定的睡眠时间

使用与睡眠时间相关的时钟,这意味着考虑时钟的调整。因此,块的持续时间可能小于或大于调用时的sleep_time-Clock::now(),这取决于调整的方向。由于调度或资源争用延迟,该函数的阻塞时间也可能长于达到睡眠时间之后

最后一句提到了这个解决方案的退步:操作系统可能决定在请求的时间之后唤醒线程/进程。可能发生这种情况,例如操作系统处于高负载状态。在“正常”情况下,延迟不应超过几毫秒。因此,延迟可能是可以忍受的


请注意
tEnd
tStart
在循环中是如何更新的。当前唤醒时间不被认为是为了防止延迟的累积。

在OPs程序中,时间的使用可以减少为

// get tStart;
// set tEnd = tStart + x;
do {
  // get t;
} while (t < tEnd);

(我必须减少迭代次数和等待时间,以防止在线编译器中出现错误。)

阻止当前线程的执行,直到达到指定的睡眠时间

使用与睡眠时间相关的时钟,这意味着考虑时钟的调整。因此,块的持续时间可能小于或大于调用时的sleep_time-Clock::now(),这取决于调整的方向。由于调度或资源争用延迟,该函数的阻塞时间也可能长于达到睡眠时间之后

最后一句提到了这个解决方案的退步:操作系统可能决定在请求的时间之后唤醒线程/进程。可能发生这种情况,例如操作系统处于高负载状态。在“正常”情况下,延迟不应超过几毫秒。因此,延迟可能是可以忍受的

请注意
tEnd
tStart
在循环中是如何更新的。当前唤醒时间不被视为防止延迟累积