C++ 準確的延時

我只知道兩種計時的方法

一個是用unistd.h 的sleep()

第二個是用ctime 的clock_t

#include <iostream>#include <ctime>using namespace std;int main(){ cout << "Enter delay time:"; float secs; cin >> secs; clock_t delay = secs * CLOCKS_PER_SEC; //convert to clock time cout << "Start"; clock_t start = clock(); while (clock() -start < delay) ; cout << "Finished\a\n"; return 0;}

不過,測試了一下才忽然發現很不準確,參數放5秒,實際上只有延遲3秒,兩種方法都一樣,還是我用錯了嗎?

如果不是我的用法錯誤,請問有人知道怎麼用非常準確的延時嗎? 至少誤差在0.01秒內的,可以的話請告訴我通平台用的方法(不只適用windows)

謝謝

已更新項目:

我測試的是在mac os x

剛才試了用system("sleep 10") 這種叫法 果然很準 不過還是不太好..

謝謝prisoner的回答

但我讀了poll()的manual page 還是看不太懂 因為太多參數了...

不知道其他參數要怎麼設置..

可以的話請舉個例子 謝謝!

2 個已更新項目:

還有請問用while 回圈 哪裡不好嗎? 謝謝

3 個已更新項目:

我學回圈的時候 書上是寫

while要用在遇到某event的時候停止 的時候用

for是實際知道次數的時候用...

如果是因為難讀的理由 應該像這樣短的還是沒什麼問題吧?

英文我大致沒問題 謝謝

4 個已更新項目:

在mac os x確實會有整數秒的誤差..

And prisoner... Sorry but I still don't get it.

Is the variable "ret" for the countdown, and you made it so it will display the message when it is finished?

But if that's so, why is there a continue statement after it then?

5 個已更新項目:

Oh, I got it, my bad. I thought you would give me a program that only does the purpose. Sorry for that, I think I also got delayed. It works great, and it is accurate to nanoseconds. I really appreciate your help, thanks!

6 個解答

評分
  • 7 年前
    最佳解答

    拜託!PO6 google 一下 馬上就可以找到:

    select() 應該可以到 usec

    poll() 應該可以到 msec

    到die.net 讀一下他們的man page 馬上派上用場

    再酸一下"戰神"。。妳寫的碼有用while () ; // loop 先扣10分再說

    2013-12-17 05:35:23 補充:

    > 還有請問用while 回圈 哪裡不好嗎? 謝謝

    loop 最重要的是他的控制 包括 1。初始2。結束3。每圈的差別

    為了要知道 start 是怎初始的 我浪費了1。5秒往上讀一行

    為了要知道 delay 是怎初始的 我浪費了4。5秒往上讀3行

    有些人更惡毒寫在125行前面 要我跳頁 5次來來回回35次來讀她的程式

    更惡毒的是在125行裡面30行是沒用的括號 55行是空白行

    這麼惡毒的程式人 扣15分實在不夠

    2013-12-17 05:41:19 補充:

    >但我讀了poll()的manual page 還是看不太懂 因為太多參數了...

    >不知道其他參數要怎麼設置..

    >可以的話請舉個例子 謝謝!

    用英語可以的話 我就給。不然妳就慢慢等!

    2013-12-17 05:47:30 補充:

    >剛才試了用system("sleep 10") 這種叫法 果然很準 不過還是不太好..

    差差差!妳沒算進system()的成本吧!system() 裡面有fork() and exec() and waitpid() 都是貴三三的耶!我有些程式大到 fork() 都要20ms

    2013-12-17 09:28:07 補充:

    This example uses select() for pure sleep on timer expiration:

    for (;;++cycle) {

    int ret;

    struct timeval tv;

    tv.tv_sec = 0;

    tv.tv_usec = 900; // sleep for 900 ns

    ret = select(0, NULL, NULL, NULL, &tv); // no fd provided

    if (ret < 0) {

    syslog("Unexpected error in system config reader thread - %d\n", ret);

    continue;

    }

    // read system config from database

    }

    2013-12-17 09:29:25 補充:

    // sorry that the for loop should have been:

    for(cycle=0;;++cycle){ // I removed too much

    ...

    }

    2013-12-17 09:38:52 補充:

    // compare

    for(delay = secs * CLOCKS_PER_SEC, start = clock();clock() -start < delay;);

    // to yours

    clock_t delay = secs * CLOCKS_PER_SEC; //convert to clock time

    ... //125 lines here

    clock_t start = clock();

    ... // a few more lines;

    while (clock() -start < delay) ;

    2013-12-17 09:41:09 補充:

    > 如果是因為難讀的理由 應該像這樣短的還是沒什麼問題吧?

    是啊!當然沒有問題。以後吃點心少少的時候,妳就用鼻子吃吧!

    同一行讓我可以看得一清2楚的東東,妳還要我一行一行地往上找?

    妳是故意的要讓妳得程式難看一點的吧!

  • 7 年前

    #include <iostream>

    #include <ctime>

    using namespace std;

    int main()

    {

    cout << "Enter delay time:";

    float secs;

    cin >> secs;

    clock_t delay = secs * CLOCKS_PER_SEC; //convert to clock time

    clock_t start_time = clock();

    clock_t current_time;

    while ((current_time = clock()) -start_time < delay)

    ;

    cout << "Start:" << start_time << "delay:" << delay << "\a\n";

    cout << "Finished:" << current_time << "\a\n";

    return 0;

    }

    實測結果

    Enter delay time:5

    Start:2371

    delay:5000

    Finished:7378

    並未如你說的差異2~3秒

    只差0.078秒

    2013-12-17 18:10:52 補充:

    應該是差0.008秒

    2013-12-17 18:25:40 補充:

    哀!! 剛剛老闆打電話要我們RD留下開會, 一時心情大壞, 連二錯

    應該是0.007秒

    至於說用while/for loop有何不好?

    那就是用while/for loop是佔用cpu的效能, 並未將資源轉給其他程式用

    如果是要做delay的工作,

    實務上是用系統提供的sleep將控制權free出去給別人用

  • 7 年前

    了解了......謝謝

  • 7 年前

    可否請版主說明一下開發環境與執行平台?

    因為 CLOCKS_PER_SEC 的定義是與平台相關的。

    另外,此段程式看起來並無明顯錯誤,

    若是在 Windows 平台下執行應不至於差這麼多 (5秒變3秒)。

  • 您覺得這個回答如何?您可以登入為回答投票。
  • Tai
    Lv 5
    7 年前

    也很想知道, 贊助兩點

  • ㄚ旺
    Lv 5
    7 年前

    WinAPI Sleep()

還有問題?馬上發問,尋求解答。