2010-05-17 6 views

Trả lời

20

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.

+0

Cảm ơn, nó trả lời câu hỏi của tôi. – Josh

14

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.

+1

Đâ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

1

Có nhiều lý do cho việc sử dụng PeekMessage trước/thay vì GetMessage:

  1. Đả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ới PM_REMOVE cờ thăm dò hàng đợi tin nhắn và bỏ qua tất cả GetMessage.
  2. 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.
  3. Gọi IsWindowUnicode trên thanh điều khiển cửa sổ của thư trả về và chọn PeekMessageA hoặc PeekMessageW.
  4. Nhiều mục ở trên.