簡體   English   中英

C ++中的延遲循環輸出

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM