Tôi tìm thấy điều này trên trang web của Tiến sĩ Dobbs ngày hôm nay tại http://www.ddj.com/hpc-high-performance-computing/220300055?pgno=3 Đó là một gợi ý tốt đẹp liên quan đến việc cấy chỉ. Cách tốt nhất để đạt được điều này với TThread ở Delphi là gì? Cảm ơn BrianLàm thế nào để chương trình số lượng các chủ đề của bạn trong Delphi
=== Từ Dr Dobbs ==============
Make đa luồng cấu hình! Số lượng các chủ đề được sử dụng trong một chương trình nên luôn luôn được cấu hình từ 0 (không có chủ đề bổ sung ở tất cả) đến một số tùy ý. Điều này không chỉ cho phép một tùy chỉnh cho hiệu suất tối ưu, nhưng nó cũng chứng minh là một công cụ gỡ lỗi tốt và đôi khi một phao cứu sinh khi các điều kiện chủng tộc chưa biết xảy ra trên các hệ thống khách hàng. Tôi nhớ nhiều hơn một tình huống mà khách hàng đã có thể khắc phục lỗi nghiêm trọng bằng cách tắt đa luồng. Điều này tất nhiên không chỉ áp dụng cho đa luồng tập tin I/O.
Hãy xem xét các giả sau đây:
int CMyThreadManger::AddThread(CThreadObj theTask)
{
if(mUsedThreadCount >= gConfiguration.MaxThreadCount())
return theTask.Execute(); // execute task in main thread
// add task to thread pool and start the thread
...
}
một cơ chế như vậy không phải là rất phức tạp (mặc dù làm việc nhiều hơn một chút có thể sẽ cần thiết hơn thể hiện ở đây), nhưng đôi khi nó rất hiệu quả. Nó cũng có thể được sử dụng với các thư viện luồng dựng sẵn như OpenMP hoặc các khối xây dựng luồng của Intel. Xem xét các số đo được hiển thị ở đây, một ý tưởng hay là bao gồm nhiều hơn một chuỗi chỉ số cấu hình (ví dụ, một cho các tệp I/O và một cho các nhiệm vụ CPU lõi). Giá trị mặc định có thể là 0 đối với số lượng tệp I/O và < được tìm thấy > cho các tác vụ CPU. Nhưng tất cả đa luồng nên có thể tháo rời. Một cách tiếp cận phức tạp hơn thậm chí có thể bao gồm một số mã để kiểm tra hiệu năng đa luồng và thiết lập số lượng các luồng được sử dụng tự động, thậm chí có thể riêng cho các tác vụ khác nhau.
===================
Không cần thiết phải tạm dừng và tiếp tục chuỗi. Để mỗi thread đợi một sự kiện hoặc semaphore, hoặc sử dụng 'WaitMessage()' với một vòng lặp thông báo chuỗi (có thể cần thiết cho OLE). Có rất nhiều cuộc thảo luận về chủ đề ở đây trên SO theo [delphi], đọc nó, nhưng tốt nhất là bỏ qua các đối số của những người nghĩ rằng họ biết rõ hơn Embarcadero và các nhà phát triển Microsoft, và cố gắng nói với bạn bằng cách sử dụng 'Suspend()' và 'Resume()' sẽ ổn. – mghie