2016-02-04 111 views
1

我一直想暂停一段时间的功能,我发现这一点。作为C的初学者,我无法确定,但它看起来像<clock.h>中的函数。 我想实现这个到我的代码,但不是没有理解它。有人可以给我一个这个功能的解释吗?

void wait(int seconds){ 
    clock_t start, end; 
    start = clock(); 
    end = clock(); 
    while (((end-start)/CLOCKS_PER_SEC) = !seconds) 
     end = clock(); 
} 
+1

而且可以避免如果由于某种原因,即使它是不可能的,(与BG过程高优先级)在不好的时间抢占循环,'(end-start)/ CLOCKS_PER_SEC'可能永远不会**等于**到'seconds'。 '((结束 - 开始)/ CLOCKS_PER_SEC)<秒'会更好。 –

+6

我希望实际的代码使用'!= seconds'而不是'=!seconds'。 –

+0

你可以申请代码给你的是取决于你的等待对象。如果您的等待时间总是少于10毫秒,您可以;否则,使用'sleep()'。 – Holsety

回答

5

这只是一个忙等待循环,这是实现延迟的非常讨厌的方式,因为它在100%盯住CPU,而无所作为。使用sleep()代替:

#include <unistd.h> 

void wait(int seconds) 
{ 
    sleep(seconds); 
} 

还要注意的是,在这个问题给出的代码是马车:

while (((end-start)/CLOCKS_PER_SEC) = !seconds) 

应该是:

while (((end-start)/CLOCKS_PER_SEC) != seconds) 

或者更好的是:

while (((end-start)/CLOCKS_PER_SEC) < seconds) 

(但如上所述,您甚至不应该使用此代码)。

+3

我只是直接使用睡眠 – BigMike

+0

@BigMike:你可能会这样做,但请注意,有一个包装函数意味着你可以在需要时添加特定于平台的实现(例如Windows上的Sleep())。答案的目的是用更好的东西替代OP的'wait()'函数的内部。 –

+2

你是100%正确的,像往常一样,它取决于OP真正需要什么,仍然当不是严格需要时,我更喜欢避免包装并使用良好的旧预处理器指令。 20年来我一直经历着太多的包装的地狱......(2至n级的间接方式最终调用一个库函数,其顶级函数的签名非常相似 - 只是增加了无用的日志记录和额外的检查)。 – BigMike

1

时钟()函数返回自该计划开始执行以来发生的系统时钟周期数。 这是原型:clock_t clock(void);

请注意,的返回值不在秒。要将结果转换为秒,您必须将返回值除以CLOCKS_PER_SEC宏。 你的程序只是做到这一点。在功能上,它停止程序执行秒(您将此值作为参数传递给等待函数)。

顺便说一句,它使用time.h,而不是clock.h。并且开始学习C并不合适。

要了解更多信息:http://www.cplusplus.com/reference/ctime/?kw=time.h

1

clock功能<ctime>

返回由程序所消耗的处理器时间。

返回的值以时钟滴答表示,其单位为 恒定但系统特定长度(关系为 CLOCKS_PER_SEC时钟滴答每秒)的时间。

reference

所以,基本上它返回,因为程序的启动处理器的周期数通过。处理器时间周期是由process执行的处理器指令的数量,但它不包含IO时间,并且不包含任何不使用CPU的情况。

CLOCKS_PER_SEC是机器执行的CPU滴答的平均数量,因机器而异,即使它(可能)会随时变化,因为执行太多的IO将导致每个进程总体减少CLOCKS_PER_SEC,因为更多的时间将会没有使用CPU。

而且这样一句话:(end-start)/CLOCKS_PER_SEC) = !seconds 是不正确的,因为正确的实现是

while (((end-start)/CLOCKS_PER_SEC) != seconds) 
    end = clock(); 

是否的busy waiting的伎俩,计划将被困这个while循环,直到seconds秒将使用CPU时钟传递和CLOCKS_PER_SEC确定时间流逝。

虽然我会建议其更改为:

while (((end-start)/CLOCKS_PER_SEC) < seconds) 
    end = clock(); 

因为如果过程具有低优先级,或者计算机太忙处理许多流程的机会是一个CPU蜱可以采取一秒钟以上(可能时系统对于一些占用大量资源并具有足够高优先级以导致CPU匮乏的漏洞程序而言,这种情况已经崩溃了)。

最后,我不建议使用它,因为你仍然在使用CPU在等待这可以通过使用睡眠工具讨论here

相关问题