2009-04-29 53 views
6

Tôi đang sử dụng mã dưới đâyC# Thread.Sleep thức dậy ngay lập tức

Thread.Sleep(5); 

ở phần cuối của một vòng lặp while. Để thử và nhận độ trễ 5ms giữa các lần lặp.

Đôi khi nó ngủ 16ms. Điều này tôi hiểu và chấp nhận, vì nó phụ thuộc vào khi CPU được xung quanh để phục vụ thread. Tuy nhiên một khi nó đã đánh thức lặp tiếp theo nó dường như thức dậy ngay lập tức sau khi cuộc gọi giấc ngủ (tôi đang đăng nhập với dấu thời gian). Có vấn đề với việc sử dụng khoảng thời gian ngủ ngắn như vậy mà nó được coi là không?

+0

Bạn có thể đăng mã nơi bạn đang gọi Thread.Sleep() không? –

+0

Đừng bận tâm. Chỉ cần đăng mã dấu thời gian. ;] – bzlm

+1

5 ms có vẻ như nó nằm trong lề lỗi, đặc biệt nếu bạn đang sử dụng dấu thời gian. Hãy thử lại bằng cách sử dụng StopWatch và cho chúng tôi biết nếu bạn vẫn thấy hành vi này. –

Trả lời

21

Vấn đề của bạn giống như trên hầu hết các máy hiện đại, DateTime.UtcNow có độ phân giải khoảng 10-15ms (mặc dù tôi thấy tài liệu cho biết khoảng 10ms kể từ NT 3.5). Nếu bạn muốn thời gian có độ phân giải cao hơn, hãy xem lớp Stopwatch, cụ thể là Stopwatch.GetTimestamp().

Cũng lưu ý rằng Đồng hồ bấm giờ sẽ chỉ sử dụng bộ hẹn giờ có độ phân giải cao nếu chúng có sẵn (Stopwatch.IsHighResolution sẽ cho bạn biết trong thời gian chạy). Nếu không, nó sẽ rơi trở lại DateTime.UtcNow.Ticks.

4

Rất có thể, sự cố đơn giản là bộ hẹn giờ của bạn có độ phân giải giới hạn. Nếu nó chỉ cập nhật, nói rằng, mỗi 10ms, bạn sẽ thấy cùng một dấu thời gian trên một số lần lặp lại, ngay cả khi 5ms đã trôi qua.

Bạn đang sử dụng bộ hẹn giờ nào để tạo dấu thời gian của mình?

0

Bạn đang chạy loại hệ thống nào? Các khoảng nhỏ có thể phụ thuộc vào bộ xử lý và độ phân giải mà nó hỗ trợ. Tôi đã chạy một ứng dụng trên thiết bị cầm tay khi độ phân giải của bộ hẹn giờ chính là 16ms. Vì vậy, nó có thể là phần cứng liên quan. Hãy thử tăng khoảng thời gian để nói 30ms và xem nếu nó hoạt động sau đó.

1

Nếu tôi nhớ chính xác thời gian cắt NT, được giới thiệu trong hạt nhân NT và vẫn hoạt động theo cùng cách với XP, hoạt động ngay xung quanh mốc 5ms. Chúng tôi đã xây dựng một ứng dụng thời gian thực và chạy vào vấn đề đó. Bạn sẽ không thể nhận được thời gian ngủ 5ms một cách nhất quán. Những gì chúng tôi thấy là đôi khi bạn sẽ nhận được 10 - 16 ms, đôi khi không có ms và đôi khi hiếm khi nhận được 5 ms.

Tôi đã thực hiện các thử nghiệm này khoảng 5 năm trước mặc dù vậy mọi thứ có thể đã thay đổi kể từ đó.

Các vấn đề liên quan