Yahoo 知識+ 將於 2021 年 5 月 4 日 (美國東岸時間) 停止服務,而 Yahoo 知識+ 網站現已轉為僅限瀏覽模式。其他 Yahoo 資產或服務,或你的 Yahoo 帳戶將不會有任何變更。你可以在此服務中心網頁進一步了解 Yahoo 知識+ 停止服務的事宜,以及了解如何下載你的資料。
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 還是看不太懂 因為太多參數了...
不知道其他參數要怎麼設置..
可以的話請舉個例子 謝謝!
還有請問用while 回圈 哪裡不好嗎? 謝謝
我學回圈的時候 書上是寫
while要用在遇到某event的時候停止 的時候用
for是實際知道次數的時候用...
如果是因為難讀的理由 應該像這樣短的還是沒什麼問題吧?
英文我大致沒問題 謝謝
在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?
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 個解答
- prisoner26535Lv 77 年前最愛解答
拜託!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出去給別人用
- ?Lv 57 年前
可否請版主說明一下開發環境與執行平台?
因為 CLOCKS_PER_SEC 的定義是與平台相關的。
另外,此段程式看起來並無明顯錯誤,
若是在 Windows 平台下執行應不至於差這麼多 (5秒變3秒)。