在c中实现时间延迟

我不确切地知道如何搜索这个…所以我没有任何运气找到任何东西..:S

我需要在C中实现延时。

例如,我想做一些事情,然后等一分钟,然后继续做一些事情。

这有道理吗? 谁能帮我吗?

在标准C(C99)中,您可以使用time()来执行此操作,例如:

 #include  : void waitFor (unsigned int secs) { unsigned int retTime = time(0) + secs; // Get finishing time. while (time(0) < retTime); // Loop until it arrives. } 

顺便说一下,这假设time()返回1秒的分辨率值。 我不认为这是标准规定的,所以你可能需要调整它。


为了澄清,这是我用ISO C99认识到这一点的唯一方法(问题只标记为“C”,这通常意味着便携式解决方案是可取的,当然,特定于供应商的解决方案仍然可以给予)。

无论如何,如果您使用的是提供更有效方式的平台,请使用它。 正如一些评论所指出的那样,在CPU使用率和电池寿命方面,这样的紧密循环可能存在特定问题。

任何体面的时间切片操作系统都能够降低连续使用其全时片的任务的动态优先级,但电池电量可能更成问题。

但是,C 没有指定托管环境中的操作系统细节,这个答案仅适用于ISO C和ISO C(因此不使用sleepselect ,Win32 API调用或类似的东西)。

请记住, POSIX sleep可能会被信号中断。 如果你要走这条路,你需要做一些事情:

 int finishing = 0; // set finishing in signal handler // if you want to really stop. void sleepWrapper (unsigned int secs) { unsigned int left = secs; while ((left > 0) && (!finishing)) // Don't continue if signal has left = sleep (left); // indicated exit needed. } 

以下是在大多数桌面系统上执行此操作的方法:

 #ifdef _WIN32 #include  #else #include  #endif void wait( int seconds ) { // Pretty crossplatform, both ALL POSIX compliant systems AND Windows #ifdef _WIN32 Sleep( 1000 * seconds ); #else sleep( seconds ); #endif } int main( int argc, char **argv) { int running = 3; while( running ) { // do something --running; wait( 3 ); } return 0; // OK } 

以下是如何在没有计时器的微型计算机/处理器上完成的:

 int wait_loop0 = 10000; int wait_loop1 = 6000; // for microprocessor without timer, if it has a timer refer to vendor documentation and use it instead. void wait( int seconds ) { // this function needs to be finetuned for the specific microprocessor int i, j, k; for(i = 0; i < seconds; i++) { for(j = 0; j < wait_loop0; j++) { for(k = 0; k < wait_loop1; k++) { // waste function, volatile makes sure it is not being optimized out by compiler int volatile t = 120 * j * i + k; t = t + 5; } } } } int main( int argc, char **argv) { int running = 3; while( running ) { // do something --running; wait( 3 ); } return 0; // OK } 

必须对waitloop变量进行微调,这些变量对于我的计算机来说非常接近,但是对于现代桌面系统来说,频率级别的变量非常不精确; 所以不要在那里使用,除非你裸露金属而不做这些东西。

检查sleep(3)手册页或MSDN for Sleep

虽然许多实现都有time函数以秒为单位返回当前时间,但不能保证每个实现都会这样做(例如,某些实现可能返回毫秒而不是 )。 因此,更便携的解决方案是使用difftimefunction。

C标准保证difftime能够返回两个time_t值之间的时间差(以秒为单位) 。 因此,我们可以编写一个便携式时间延迟function,它将在C标准的所有兼容实现上运行。

 #include  void delay(double dly){ /* save start time */ const time_t start = time(NULL); time_t current; do{ /* get current time */ time(&current); /* break loop when the requested number of seconds have elapsed */ }while(difftime(current, start) < dly); } 

timedifftime函数的一个警告是C标准从未指定粒度。 大多数实现的粒度为一秒 。 虽然这对于持续几秒钟的延迟来说是完全正确的,但是我们的延迟function可能会持续太长时间以至于延迟持续不到一秒

有一种便携式标准C替代方案: clockfunction。

clock函数返回实现对程序使用的处理器时间的最佳近似值,因为实现定义的时代开始仅与程序调用有关。 要确定以秒为单位的时间, clock函数返回的值应除以宏CLOCKS_PER_SEC的值。

clockfunction解决方案与我们的timefunction解决方案非常相似:

 #include  void delay(double dly){ /* save start clock tick */ const clock_t start = clock(); clock_t current; do{ /* get current clock tick */ current = clock(); /* break loop when the requested number of seconds have elapsed */ }while((double)(current-start)/CLOCKS_PER_SEC < dly); } 

在这种情况下有一个类似于timedifftimeclock函数的粒度留给实现。 例如,具有32位值的clock_t且分辨率为微秒的计算机最终可能会在2147秒(约36分钟)后包装clock返回的值。

因此,考虑使用延迟函数的timedifftime实现用于持续至少一秒的延迟,并且延迟持续时间小于一秒clock实现。

最后要提醒的是: clock返回处理器时间而不是日历时间 ; clock可能与实际经过的时间不对应(例如,如果进程hibernate)。

对于长达一分钟的延迟, sleep()是一个不错的选择。

如果有一天你想暂停小于一秒的延迟,你可能想要考虑使用超时的poll()

两者都是POSIX。

尝试sleep(int number_of_seconds)

sleep(int)是一个很好的延迟。 一分钟:

 //Doing some stuff... sleep(60); //Freeze for A minute //Continue doing stuff... 

timer吗?

对于WIN32,请尝试http://msdn.microsoft.com/en-us/library/ms687012%28VS.85%29.aspx

你可以简单地调用delay()函数。 因此,如果您想在3秒内延迟该过程,请拨打延迟(3000)…

如果您确定要等待并且永远不会中断,请在POSIX中使用sleep或在Windows中使用Sleep。 在POSIX睡眠需要几秒钟的时间,所以如果你想要更短的时间,有像usleep()这样的变种使用微秒。 在Windows中睡眠需要几毫秒,很少需要比这更精细的粒度。

您可能希望等待一段时间但希望允许中断,可能是在紧急情况下。 睡眠可以被信号中断,但在这种情况下有更好的方法。

因此,我实际上在实践中发现你所做的是等待事件或条件变量超时。

在Windows中,您的调用是WaitForSingleObject 。 在POSIX中,它是pthread_cond_timedwait

在Windows中,您还可以使用WaitForSingleObjectEx ,然后通过调用QueueUserAPC实际上可以通过任何排队任务“中断”您的线程。 WaitForSingleObject(Ex)将返回一个代码,确定它退出的原因,因此您将知道它何时返回“TIMEDOUT”状态,确实超时。 您希望它终止时设置它正在等待的事件。

使用pthread_cond_timedwait您可以向广播条件变量发送信号。 (如果有几个线程正在等待同一个线程,则需要进行广播以将它们全部唤醒)。 每次循环时都应检查条件。 您的线程可以获取当前时间并查看它是否已通过,或者它可以查看是否已满足某些条件以确定要执行的操作。 如果你有某种队列,你可以检查它。 (您的线程将自动锁定用于等待条件变量的互斥锁,因此当它检查条件时它只能访问它)。

 system("timeout /t 60"); // waits 60s. this is only for windows vista,7,8 system("ping -n 60 127.0.0.1 >nul"); // waits 60s. for all windows 

写这段代码:

 void delay(int x) { int i=0,j=0; for(i=0;i