Hệ điều hành: Windows 7Chức năng gọi cho giấc ngủ của WinAPI Sleep() dài hơn mong đợi
Khi gọi hàm WinAPI Sleep() là Ngủ (1) chủ đề thực sự ngủ trong 15ms. Tôi đã làm nó 100 lần trong một vòng lặp và tổng thời gian ngủ là 1500ms thay vì 100.
Đây có phải là hành vi phổ biến hoặc tôi nên bị lúng túng về điều gì đó sai với MOBO, CPU, cài đặt Windows?
EDIT: Nếu có thể bạn có thể chạy mã này và đăng thời gian ngủ là bao lâu. Tôi để một người bạn của tôi điều hành nó, và anh ta thực sự đã có tất cả ở 1ms.
#include <iostream>
#include <ctime>
#include <Windows.h>
void test(void)
{
std::cout << "Testing 1ms sleep." << std::endl;
for (unsigned int i = 0; i < 10; i++)
{
std::clock_t startClocks = std::clock();
Sleep(1);
std::clock_t clocksTaken = std::clock() - startClocks;
std::cout << "Time: " << clocksTaken << "ms." << std::endl;
}
}
int main(void)
{
test();
std::cin.sync();
std::cin.get();
return 0;
}
EDIT2: Dường như lý do tại sao một số người đang nhận 1ms là một số chương trình khác đang chạy đặt độ phân giải bộ đếm giờ thành toàn bộ thành 1ms. Theo mặc định, điều này phải là 15,6ms trên Windows 7.
Từ Giấc ngủ có thể dễ dàng mất một thời gian khác nhau tùy thuộc vào nhiều yếu tố (phần cứng/os nó đang chạy, tải của bộ vi xử lý tại thời điểm đó vv) Tôi không chắc chắn những gì bạn hy vọng đạt được bằng cách yêu cầu mọi người chạy mã đó. Nó sẽ là hoàn toàn có thể cho nó để sản xuất một thời gian khác nhau cho mỗi lần lặp của vòng lặp, mỗi lần nó chạy. – obmarg
Tôi không nghĩ rằng Sleep() là phần cứng cụ thể trên Windows. Nếu bạn không chạy bất kỳ chương trình nào sử dụng timeBeginPeriod() thì kết quả sẽ là 15-16ms. Ví dụ: Windows Media Player đặt nó thành 10ms và BSPlayer thành 1ms. Nó cũng đã được nói rằng một số trình duyệt điều chỉnh nó. – NFRCR
Có lẽ nó không được kết nối trực tiếp, nhưng vẫn có thể có một liên kết gián tiếp - nếu bạn đang chạy các cửa sổ trên một máy tính không đủ mạnh tải sẽ tăng lên và thời gian trước khi trở về giấc ngủ cũng có thể. – obmarg