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问题,但我不想坚持,我刚刚提出了一个投票条件的技术,并举了一个例子说有点愚蠢,但只是为了解释。