![](/img/trans.png)
[英]curl_easy_perform in c++ stops a timer used for something else.
[英]Broken timer or something else
我有一些必須幫助我的程序,但我無法處理時間。
雇用是一個代碼:
#include <iostream>
using namespace std;
#include <time.h>
#include <Windows.h>
double diffclock(clock_t clock1) {
clock_t clock2 = clock();
double diffticks = clock1 - clock2;
double diffms = diffticks / (CLOCKS_PER_SEC / 1000);
return diffms;
}
int main()
{
int wait = 134;
clock_t fullbetween = clock();
for (int i = 0; i < 5; i++) {
Sleep(wait / 5);
cout << wait / 5 << " ";
}
cout << endl << "finish in " << diffclock(fullbetween) << " ms" << endl;
return 0;
}
C++ 版本。 相同的結果:
#include <iostream>
#include <chrono>
#include <ctime>
#include <thread>
#include <Windows.h>
int main()
{
int wait = 134;
auto start = std::chrono::system_clock::now();
for (int i = 0; i < 5; i++) {
std::this_thread::sleep_for(std::chrono::milliseconds(wait/5));
}
auto end = std::chrono::system_clock::now();
auto int_ms = std::chrono::duration_cast<std::chrono::milliseconds> (end - start);
std::cout << std::endl << "finish in " << int_ms.count() << " ms" << std::endl;
return 0;
}
134 / 5 = 26 沒問題。 但在最后一個“cout”中,它表明所有迭代都花費了大約 170 毫秒,而不是預期的 130 毫秒。 為什么會這樣?
對不起我的英語。
https://docs.microsoft.com/en-gb/windows/win32/api/synchapi/nf-synchapi-sleep的睡眠 function 的文檔說
暫停當前線程的執行,直到超時間隔過去。
系統時鍾以恆定速率“滴答”。 如果 dwMilliseconds 小於系統時鍾的分辨率,則線程可能休眠的時間少於指定的時間長度。 如果 dwMilliseconds 大於 1 個滴答但小於 2 個滴答,則等待可能介於 1 到 2 個滴答之間,依此類推。
Windows 系統上的滴答聲通常為 15.6 毫秒(每秒 64 個滴答聲),因此 26 變為 31.2。 這是暫停線程可能再次激活的時間,不能保證它會立即開始執行。 所以你的五個睡眠變成了 156ms 加上一點開銷。
文檔繼續對此行為進行緩解,並警告緩解將影響系統電源使用等。
要提高睡眠間隔的准確性,請調用 timeGetDevCaps function 以確定支持的最小計時器分辨率,並調用 timeBeginPeriod function 將計時器分辨率設置為最小值。
在 std::this_thread::sleep_for 文檔中(在此處找到)
據說 function 至少在指定的 sleep_duration 內阻止當前線程的執行。
由於調度或資源爭用延遲,它可能會阻塞比 sleep_duration 更長的時間。
因此,您的代碼將至少需要 135 毫秒才能執行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.