2012-03-16 20 views
7

1.Tôi có một số vòng infinte làm thế nào tôi có thể nhận được mức tiêu thụ CPU thấp nhất? Tôi có nên sử dụng độ trễ không?Làm thế nào để có được mức tiêu thụ CPU thấp nhất khi có vòng lặp infinte trong một chủ đề

2.Nếu tôi có nhiều chủ đề đang chạy trong ứng dụng của mình và một trong số đó là THREAD_PRIORITY_IDLE có ảnh hưởng đến các chủ đề khác không?

Mã của tôi là như thế này cho mỗi chủ đề

procedure TMatchLanLon.Execute; 
begin 
while not Terminated do 
    begin 
      //some code 
      Sleep(1000); 
    end; 
end; 
+0

Hãy thêm phiên bản Delphi của bạn. Điều quan trọng đối với các câu hỏi liên quan đến chuỗi. – TLama

+0

@TLama phiên bản delphi của tôi là XE2 – opc0de

+1

Sao chép [câu hỏi của riêng bạn] (http://stackoverflow.com/questions/9715378/infinite-loops-in-separate-threads "vòng vô hạn trong các chuỗi riêng biệt")? –

Trả lời

9

Thông thường một sợi nên ngủ cho đến khi tín hiệu, nhưng không sử dụng Sleep hoặc SleepEx.

Bạn tạo Sự kiện và Chờ cho nó được báo hiệu, bằng cách sử dụng TEvent hoặc chuyển trực tiếp đến Win32 API với WaitForSingleObject.

Sleep gây ra rất nhiều vấn đề, bao gồm cả những gì tôi gọi là bệnh "Làm đẹp ngủ". Toàn bộ phần còn lại của ứng dụng của bạn đã chấm dứt và tắt một vài trăm microseconds trước đây và luồng của bạn đã ngủ trong "triệu năm" trong các điều khoản thời gian máy tính tương đối và khi nó đánh thức phần còn lại của ứng dụng của bạn từ lâu. Điều tiếp theo chủ đề nền của bạn có khả năng làm là truy cập một số đối tượng mà nó có tham chiếu đến, đã được cố định, và sau đó (nếu bạn may mắn) nó sẽ sụp đổ. Không sử dụng Sleep trong chuỗi. Đợi cho các sự kiện, hoặc sử dụng một số chuỗi công nhân được xây dựng sẵn (như một chuỗi OmniThreadLibrary).

+4

Nếu chuỗi của bạn đang thực thi mã (không phải là ngủ), nó vẫn có thể làm như vậy sau khi ứng dụng bị chấm dứt. Một vòng lặp đơn giản hoặc một thao tác phức tạp cũng có thể mất vài giây mà không có sự tương tác với phần còn lại của ứng dụng. Vì vậy, giấc ngủ không phải là xấu theo nghĩa đó. Nếu chuỗi của bạn bị treo sau khi ngủ, nó cũng có thể bị lỗi sau (hoặc trong quá trình) một thao tác khác. Không nói rằng việc sử dụng giấc ngủ trong một sợi chỉ là tốt, nhưng lý do bạn mô tả là không. – GolezTrol

+4

Windows dừng tất cả các luồng khi thoát ứng dụng trước khi deallocating bất kỳ tài nguyên. Sleep() chỉ là tốt trong chủ đề - Tôi đã sử dụng nó, (cho mục đích thích hợp của nó, không phải là một nạng bỏ phiếu trong một ứng dụng comms-thách thức), trong nhiều thập kỷ. –

+0

'Nếu chuỗi của bạn đang thực thi mã (không phải là ngủ), nó vẫn có thể làm như vậy sau khi ứng dụng bị chấm dứt' - không, nó không thể. Tất cả các chủ đề hoặc có trạng thái của họ thiết lập để họ không bao giờ chạy một lần nữa hoặc, nếu chạy trên một lõi khác với một trong đó đã thoát, có bộ xử lý của họ bị gián đoạn để ngăn chặn chúng. Khi tất cả các chủ đề đã dừng lại, tài nguyên được deallocated. –

6

Tôi có một số vòng infinte làm thế nào tôi có thể nhận được mức tiêu thụ CPU thấp nhất?

Bằng cách chặn vòng lặp cho đến khi có điều gì đó cần làm.

Nếu tôi có nhiều chủ đề đang chạy trong ứng dụng của mình và một trong số đó là THREAD_PRIORITY_IDLE có ảnh hưởng đến chủ đề khác không?

..depends. Có lẽ không, nhưng nếu bất kỳ chủ đề khác đang chờ đợi trên đầu ra từ chủ đề này, hoặc phát hành một khóa từ nó, sau đó các chủ đề khác có hiệu quả 'kéo xuống' để THREAD_PRIORITY_IDLE là tốt.
Ngoài sự đảo ngược ưu tiên này, (có thể gây ra các lỗi khi các luồng có nhiều mức ưu tiên), các khóa xoay, một cấu trúc đồng bộ hóa thường chỉ tệ, có thể trở thành tai hại.

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