[英]delay loop output in C++
我有一個while循環,它在do while循環中運行。 我需要while循環才能准確地每秒運行一次,而不是更快,再也不慢。 但是我不確定我該怎么做。 這就是循環,關閉了它自己的功能。 我聽說過sleep()函數,但也聽說它不是很准確。
int min5()
{
int second = 00;
int minute = 0;
const int ZERO = 00;
do{
while (second <= 59){
if(minute == 5) break;
second += 1;
if(second == 60) minute += 1;
if(second == 60) second = ZERO;
if(second < 60) cout << "Current Time> "<< minute <<" : "<< second <<" \n";
}
} while (minute <= 5);
}
您可以達到的最佳准確性是使用操作系統(OS)功能。 您需要找到還具有回調功能的API。 回調函數是您編寫的函數,計時器到期后操作系統將調用該函數。
請注意,由於程序執行時正在運行的其他任務和活動,操作系統可能會失去計時精度。
如果您需要便攜式解決方案,那么就不要期望高精度的定時。 通常,您只能通過依賴於平台的解決方案來實現。
便攜式(盡管不是非常高效的CPU,也不是特別優雅)的解決方案可能會使用類似於以下的功能:
#include <ctime>
void wait_until_next_second()
{
time_t before = time(0);
while (difftime(time(0), before) < 1);
}
然后,您可以在函數中使用以下代碼:
int min5()
{
wait_until_next_second(); // synchronization (optional), so that the first
// subsequent call will not take less than 1 sec.
...
do
{
wait_until_next_second(); // waits approx. one second
while (...)
{
...
}
} while (...)
}
有關您的代碼的其他說明:
每minute
達到值5,您的代碼就會陷入無限循環。
您是否知道00
表示八進制 (基數8)數字(由於前導零)? 在這種情況下無關緊要,但請注意諸如017
數字。 這是十進制的15,而不是17!
您可以將seconds++
合並到while
循環的條件中: while (seconds++ <= 59) ...
我認為在這種情況下,最好將endl
插入到cout
流中,因為那樣會刷新它,而插入"\\n"
不會刷新該流。 在這里並不重要,但是您的意圖似乎是總是看到cout
的當前時間; 如果不刷新流,實際上並不能保證立即看到時間消息。
例如,在Windows中,可以創建一個可等待的計時器對象。
如果您的操作系統如此,請在此處查看文檔,例如Waiting Timer Objects 。
根據您提供的代碼,您似乎可以輕松完成睡眠。 保證您的循環主體精確地每1秒執行一次是沒有意義的。 而是讓它每秒執行10次,並檢查您上次采取措施后經過的時間是否超過一秒。 如果沒有,則什么也不做。 如果是,請采取措施(打印您的消息,增加變量等),存儲上一次采取措施的時間並再次循環。
正如其他人發布的,您的操作系統可能提供某種警報或計時器功能。 您應該嘗試使用這種方式,而不是編寫自己的輪詢循環。 輪詢時間意味着您需要每秒進行一次上下文切換,這可以在系統可能在做其他事情時保持代碼運行。 在這種情況下,您打斷別人300次只是說“我們做完了”。
另外,您永遠都不要假設睡眠時間長短-即使您使用的是實時操作系統也不安全-您應該始終詢問實時時鍾或滴答計數器每次經過了多少時間,否則會累積任何錯誤因此,隨着時間的流逝,您將獲得越來越少的准確性。 即使在實時系統上也是如此,因為即使實時系統可以准確地睡眠1秒鍾,您的代碼也需要花費一些時間才能運行,因此每次通過循環時,都會累積此計時錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.