簡體   English   中英

持續檢查直到條件成立的有效方法是什么

[英]What is the efficient way to continuously check until a condition is true

所以我有這個程序不斷檢查直到條件為真。 我的問題是每當我運行它時,我的計算機都會因為循環而變慢。 任何人都可以建議最好和最有效的方法來做到這一點嗎? 感謝您提前回復。 為了說明我的問題,這里是一個代表它的代碼:

#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;
}

如果輪詢確實是您想要的,或者您必須使用它,那么您必須通過使用睡眠來讓系統呼吸。

那么,每次迭代要睡多少? 它可以是一個固定值(如果你只睡 1 毫秒,你會驚訝於它的效果如何)。 如果您檢查真實用戶的擊鍵等緩慢事件,則固定值(例如 20-30 毫秒)是不錯的選擇。 例如,如果您正在監視串行端口,則可能需要較低的值。

然后,根據應用程序,您還可以實現可變睡眠時間。 例如(這有點愚蠢但只是為了解釋):您等待按鍵,然后休眠 30 毫秒。 然后你在管道中使用你的程序並發現它非常緩慢。 一種解決方案是將值設置為 sleep 等於 30 ms,但在讀取一個字符后,該值會降低為 0,這會導致不執行睡眠。 每次條件失敗時,該值都會提高到最大限制(鍵盤為 20-30 毫秒)。

-- 評論后編輯 --

已經指出鍵盤和串口不需要輪詢,或者不應該輪詢。 一般來說,這是正確的,但它取決於硬件和操作系統(這又是一個軟件,如果硬件不支持給定條件的中斷,即使操作系統也必須輪詢)。 例如,關於鍵盤,我想到了那些作為按鈕矩陣實現的小鍵盤:一些小型 CPU 具有特殊設施來在任何 I/O 更改時生成中斷,但其他的則沒有:在這種情況下,輪詢是唯一的解決方案- 並且它也是實現反彈跳的理想選擇(這種輪詢不一定在循環內執行)。

對於串行端口,幾乎沒有人會在沒有中斷的情況下實現它(以避免輪詢)。 但即便如此,也很難以事件驅動的方式管理傳入的數據。 通常設置一個標志,程序的其他部分輪詢該標志,將計算出消息

事件驅動的編程起初似乎很容易,但一旦程序變大,復雜性也會增加。

還有其他情況需要考慮,例如從某處讀取數據並處理這些數據的循環。 如果循環內部還需要做其他事情,例如檢查過去了多少時間,但是讀取是阻塞的,則必須以非阻塞方式實現讀取,並且整個循環必須變成一種輪詢一個或多個條件 - 除非一個使用多線程。

無論如何,我同意輪詢是邪惡的,應該只在必要時使用。

有效率的? 您需要以一種或另一種方式讓您的過程進入睡眠狀態,直到條件成立 - 然后醒來並死亡(可以這么說:-)。 由於您的代碼包含windows.h我假設您在 Windows 上運行,因此可以使用Sleep()函數。

#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;
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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