Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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_Loops - Fatal编程技术网

C 什么是持续检查直到条件为真的有效方法

C 什么是持续检查直到条件为真的有效方法,c,loops,C,Loops,所以我有一个程序,不断地检查,直到条件为真。我的问题是,每当我运行它时,我的计算机都会因为循环而变慢。有人能提出最好、最有效的方法吗?感谢您提前回复。 为了说明我的问题,下面是一段代码: #include <stdio.h> #include <time.h> #include <string.h> #include <windows.h> int main(void){ time_t now; struct tm *local;

所以我有一个程序,不断地检查,直到条件为真。我的问题是,每当我运行它时,我的计算机都会因为循环而变慢。有人能提出最好、最有效的方法吗?感谢您提前回复。 为了说明我的问题,下面是一段代码:

#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;
}
如果轮询确实是您想要的,或者您必须使用它,那么您必须通过使用sleep来让系统呼吸

那么,在每次迭代中需要睡多少觉呢?它可以是一个固定值,如果你只睡1毫秒,你会惊讶于它的效果。一个固定的值,比如说20-30毫秒,如果你检查一个真实用户的击键之类的慢事件,这是很好的。比如说,如果您正在监视一个串行端口,可能需要较低的值

然后,根据应用程序的不同,还可以实现可变的睡眠时间。例如,这有点愚蠢,但只是为了解释:您等待击键,然后睡眠30毫秒。然后你在管道中使用你的程序,发现它非常慢。一种解决方案是将值设置为睡眠等于30毫秒,但在读取字符后,该值将降低到0,从而导致不执行睡眠。每次条件失败时,该值都会被提升到键盘的最大限制20-30毫秒

-评论后编辑-

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

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

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

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

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

如果轮询真的是你想要的,或者你必须使用它,那么你必须使用sleep的呼吸系统

那么,在每次迭代中需要睡多少觉呢?它可以是一个固定值,如果你只睡1毫秒,你会惊讶于它的效果。一个固定的值,比如说20-30毫秒,如果你检查一个真实用户的击键之类的慢事件,这是很好的。比如说,如果您正在监视一个串行端口,可能需要较低的值

然后,根据应用程序的不同,还可以实现可变的睡眠时间。例如,这有点愚蠢,但只是为了解释:您等待击键,然后睡眠30毫秒。然后你在管道中使用你的程序,发现它非常慢。一种解决方案是将值设置为睡眠等于30毫秒,但在读取字符后,该值将降低到0,从而导致不执行睡眠。每次条件失败时,该值都会被提升到键盘的最大限制20-30毫秒

-评论后编辑-

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

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

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

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


无论如何,我同意投票是邪恶的,应该只在必要时使用。

有效吗?不管怎样,你需要让你的过程进入睡眠状态,直到情况变为现实——然后醒来,可以说是死去。由于您的代码包含windows.h,我将假定您正在windows上运行,因此具有睡眠功能

#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;
  }

有效地?不管怎样,你需要让你的过程进入睡眠状态,直到情况变为现实——然后醒来,可以说是死去。由于您的代码包含windows.h,我将假定您正在windows上运行,因此具有睡眠功能

#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;
  }

计算你需要等待多长时间,然后再睡觉。理想的解决方案是使用操作系统工具,例如Windows,并让你的程序块直到条件变为真。投票是邪恶的。如果可以避免的话。@FoggyDay,您在Windows上设置了计时器,但这不会触发事件,它会向您发送一个WM_计时器读取-您需要一个窗口和一个活动的消息泵,这对于一个简单的控制台应用程序来说是不切实际的。我要说的是,在这种情况下,按照卡鲁姆的建议去做。简单的睡眠和等待事件之间有什么区别?是的,我想kaylum建议的是最有效的方法,谢谢你,顺便说一句kaylum。每个提出重要问题的人:问:你在哪个平台上运行?磁盘操作系统窗户?问:条件是什么。。。它是如何变成现实的?您正在轮询设备吗?你能在没有轮询的情况下测试设备吗?例如,使用简单的轮询循环是一个糟糕的选择。。。如果你有更好的选择。计算你需要等待多长时间,然后再睡觉。理想的解决方案是使用操作系统工具,例如Windows,并让你的程序块直到条件变为真。投票是邪恶的。如果可以避免的话。@FoggyDay,您在Windows上设置了计时器,但这不会触发事件,它会向您发送一个WM_计时器读取-您需要一个窗口和一个活动的消息泵,这对于一个简单的控制台应用程序来说是不切实际的。我要说的是,在这种情况下,按照卡鲁姆的建议去做。简单的睡眠和等待事件之间有什么区别?是的,我想kaylum建议的是最有效的方法,谢谢你,顺便说一句kaylum。每个提出重要问题的人:问:你在哪个平台上运行?磁盘操作系统窗户?问:条件是什么。。。它是如何变成现实的?您正在轮询设备吗?你能在没有轮询的情况下测试设备吗?例如,使用简单的轮询循环是一个糟糕的选择。。。如果您有更好的选择。键盘和串行端口不需要进行民意调查。@MartinJames您假设的是特定的硬件。@linuxfan-您批评的是Martin James在这方面的表现!观察键盘和串行端口,但您假设轮询是解决方案。我相信这可能是一场灾难。我相信,如果我们更多地了解OP真正想做的事情,我们也许能够提出一个不同的——也许更好的——替代方案。@FoggyDay我不这么认为:我的帖子从民调是否真的是你想要的或者你可以使用开始。我并不是批评马丁,而是考虑到不仅存在带有中断驱动的键盘和串行端口的PC。我是一名嵌入式程序员,8位CPU,我经常使用轮询。@FoggyDay还请考虑问题询问的内容测试条件,以及问题下的注释-投票最多的提到睡眠。还有人说投票是邪恶的:也许这是一个XY问题,但我不想坚持,我刚刚提出了一个投票条件的技术,并举了一个例子,说“有点愚蠢”,只是为了解释。键盘和串行端口不需要进行民意调查。@MartinJames你假设的是特定的硬件。@linuxfan-你在批评Martin James的错误!观察键盘和串行端口,但您假设轮询是解决方案。我相信这可能是一场灾难。我相信,如果我们更多地了解OP真正想做的事情,我们也许能够提出一个不同的——也许更好的——替代方案。@FoggyDay我不这么认为:我的帖子从民调是否真的是你想要的或者你可以使用开始。我不是批评马丁,而是考虑到不仅存在带有中断驱动键盘的PC。
d串行端口。我是一名嵌入式程序员,8位CPU,我经常使用轮询。@FoggyDay还请考虑问题询问的内容测试条件,以及问题下的注释-投票最多的提到睡眠。也有人说,投票是邪恶的:也许这是一个XY问题,但我不想坚持,我刚刚提出了一个投票条件的技术,并举了一个例子说有点愚蠢,但只是为了解释。