Cho: Tôi điền vào một loạt các xử lý với các sự kiện đặt lại tự động và chuyển nó đến WaitForMultipleObjects với bWaitAll = FALSE.Hành vi của WaitForMultipleObjects khi nhiều xử lý tín hiệu cùng một lúc
Từ MSDN: “Khi bWaitAll là FALSE, hàm này kiểm tra các chốt trong mảng theo thứ tự bắt đầu bằng chỉ mục 0, cho đến khi một trong các đối tượng được báo hiệu. Nếu nhiều đối tượng trở thành tín hiệu, hàm trả về chỉ mục của xử lý đầu tiên trong mảng có đối tượng được báo hiệu. ”
Vì vậy, bây giờ nếu nhiều đối tượng báo hiệu tôi sẽ lấy chỉ mục của giá trị đầu tiên. Tôi có phải lặp qua mảng của mình để xem liệu có bất kỳ người nào khác đã báo hiệu không?
Ngay bây giờ tôi có một vòng lặp đó là dọc theo dòng:
For (; ;)
{
WaitForMultipleObjects(…)
If (not failed)
Process object that called.
Remove the handle that signaled from the array.
Compact the arrary.
}
Đây là giải pháp hiệu quả được sử dụng. Chìa khóa tôi cần tìm ra là “nếu nhiều vật thể được báo hiệu, chúng sẽ vẫn được báo hiệu khi bạn quay trở lại.” Nếu tôi không phải lo lắng về nạn đói thì giải pháp ban đầu của tôi vẫn ổn. – Chris
Có. WaitForMultipleObjects() quét mảng xử lý từ 0 trở đi và trả về ngay sau khi nó tìm thấy một xử lý được báo hiệu. Chỉ lần đầu tiên tìm thấy xử lý được đặt lại trạng thái unsignalled; những người khác bị ảnh hưởng. –