持续检查直到条件成立的有效方法是什么

时间:2020-03-28 06:20:18

标签: c loops

所以我有这个程序不断检查,直到条件成立为止。我的问题是每当我运行它时,由于循环的原因,计算机的速度就会降低。任何人都可以建议最好,最有效的方法吗?感谢您的提前答复。 为了说明我的问题,下面是表示它的代码:

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

int main(void){
    time_t now;
    struct tm *local;
    while(1){
        time(&now);
        local = localtime(&now);

        if(local->tm_min > 55){
            printf("Time:\t%d:%d:%d\n",local->tm_hour,local->tm_min,local->tm_sec);
            getch();
            exit(0);
        }
    }

    return 0;
}

2 个答案:

答案 0 :(得分:2)

如果轮询确实是您想要的,或者您必须使用它,那么您必须通过使用睡眠呼吸系统。

那么,每次迭代要睡多少时间?它可以是一个固定值(如果您仅睡1毫秒,您将被其有效效果震惊)。如果您检查诸如真实用户的击键之类的慢事件,则固定值(例如20-30毫秒)是很好的。例如,如果您正在监视串行端口,则可能需要较低的值。

然后,根据应用程序,您还可以实现变量睡眠时间。例如(这有点愚蠢,但这只是为了解释):您等待击键,然后睡眠30毫秒。然后,您在管道中使用程序,发现程序运行缓慢。一种解决方案是将值设置为sleep等于30 ms,但是在读取字符后,该值降低为0,这导致无法执行休眠。每次条件失败时,该值都会提高到最大限制(键盘为20到30毫秒)。

-评论后编辑-

它指出键盘和串行端口不需要轮询,或者不应该轮询。一般来说,这是正确的,但取决于硬件和操作系统(反过来又是软件),如果硬件在给定条件下不支持中断,则即使OS也必须轮询。例如,关于键盘,我想到的是那些实现为按钮矩阵的小键盘:某些小型CPU具有特殊的功能,可在任何I / O更改时生成中断,而其他则没有:在这种情况下,轮询是唯一的解决方案-并且它也是实现防反弹的理想选择(这种轮询不一定在循环内执行)。

对于串行端口,几乎没有人会在不中断的情况下实现一个端口(以避免轮询)。但是,即使这样,也很难以事件驱动的方式管理传入的数据。通常会设置一个标志,而轮询该标志的程序的其他部分则会计算出 message

一开始,事件驱动的编程似乎很容易,但是一旦程序变大,复杂性也会增加。

还有其他情况需要考虑,例如从某个地方读取数据并处理这些数据的循环。如果必须在循环内执行其他操作,例如检查经过了多少时间,但读取处于阻塞状态,则必须以非阻塞方式实现读取,并且整个循环必须变为一种轮询一个或多个条件-除非一个条件使用多线程。

无论如何,我同意轮询是邪恶的,应仅在必要时使用。

答案 1 :(得分:1)

有效吗?您需要一种方法使过程进入睡眠状态直到条件变为真-然后醒来并死亡(可以说:-)。由于您的代码包含windows.h,因此我假设您正在Windows上运行,因此可以使用Sleep()函数。

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

int main(void)
  {
  time_t now;
  struct tm *local;
  DWORD msecs;

  time(&now);
  local = localtime(&now);

  /* (55 * 60000) = msecs in 55 minutes */
  msecs = (55 * 60000) - ((local->tm_min * 60000) + (local->tm_sec * 1000));

  if(msecs > 0)
    Sleep(msecs)    

  return 0;
  }
相关问题