Tại sao cần có câu lệnh peekMessage trước Getmessage() để tạo hàng đợi tin nhắn?Tại sao phải đi tiểu trước khi getmessage?
Trả lời
Không bắt buộc.
Tuy nhiên, đôi khi bạn sẽ thấy một chuỗi chưa sẵn sàng xử lý thư nhưng nó muốn có thể nhận thư trong hàng đợi thư của nó. Chủ đề mới không có hàng đợi tin nhắn ngay lập tức, nhưng gọi PeekMessage
là đủ để tạo hàng đợi tin nhắn. Nó trả về ngay lập tức vì không có thông báo, và điều đó cho phép thread tiếp tục tự sẵn sàng. Trong khi chờ đợi, các chủ đề khác có thể bắt đầu xếp hàng các thông điệp cho chuỗi mới. Khi chuỗi mới đã sẵn sàng, nó sẽ gọi GetMessage
để truy xuất thư đầu tiên khỏi hàng đợi hoặc để đợi thư được đưa vào hàng đợi.
Không. Hai chức năng làm những việc khác nhau.
PeekMessage (...) không chờ thông báo xuất hiện - nó sẽ hiển thị thông báo đầu tiên nếu có, tùy chọn xóa nó khỏi hàng đợi, nhưng trả về false ngay lập tức không có. Nó phổ biến hơn trong các ứng dụng mà bạn đang thực hiện một số xử lý trong khi chờ đợi tin nhắn và không thể chỉ ngồi đó và chờ mãi cho tin nhắn tiếp theo. Trò chơi thời gian thực và dễ dàng rơi vào thể loại này.
GetMessage (...) đợi đến khi có tin nhắn và nhận được tin nhắn. Đó là hiệu quả hơn CPUwise, gây ra nó không liên tục bỏ phiếu, nhưng nó sẽ tạm dừng nếu không có bất kỳ tin nhắn. Nó phổ biến hơn trong các ứng dụng formy và các chương trình khác không yêu cầu xử lý thời gian thực liên tục để tiếp tục.
Đây là một tham chiếu khác, lưu ý rằng nó không nhất thiết phải là cách khôn ngoan nhất để thực hiện công việc nền (có vẻ như Delphi có chủ đề): http://windows-programming.suite101.com/article.cfm/win32_message_processing_primer – HostileFork
Có nhiều lý do cho việc sử dụng PeekMessage
trước/thay vì GetMessage
:
- Đảm bảo chương trình sẽ không treo cho đến khi một tin nhắn đến - đó là một chút dư thừa, vì bạn có thể trực tiếp sử dụng
PeekMessage
vớiPM_REMOVE
cờ thăm dò hàng đợi tin nhắn và bỏ qua tất cảGetMessage
. - Sử dụng chức năng với
PM_NOREMOVE
và quyết định xem bạn có muốn xử lý và/hoặc xóa thư khỏi hàng đợi hay không. - Gọi
IsWindowUnicode
trên thanh điều khiển cửa sổ của thư trả về và chọnPeekMessageA
hoặcPeekMessageW
. - Nhiều mục ở trên.
Cảm ơn, nó trả lời câu hỏi của tôi. – Josh