2011-07-21 32 views

Trả lời

17

SendMessage() có thể bị từ chối, nếu bạn gọi từ trong ngữ cảnh cuộc gọi COM, nơi đối tượng COM sống trong STA (cuộc gọi được gửi qua máy bơm tin nhắn). PostMessage() không bị hạn chế tuân thủ các quy tắc của COM căn hộ.

Ngoài ra, PostMessage() đặt thông báo ở cuối hàng đợi tin nhắn của cửa sổ. SendMessage() bỏ qua hàng đợi. Bạn có thể tìm thấy một cuộc thảo luận dài hơn về hàng đợi tin nhắn trên blog của Raymond Chen The Old New Thing.

Điểm của tôi là có nhiều sự khác biệt giữa SendMessage()PostMessage() so với mắt. Tôi thực sự khuyên bạn nên đi qua blog của Raymond, vì anh ấy đã bao phủ nhiều gotchas trong những năm qua.

4

PostMessageWaitForSingleObject cho phép bạn thực hiện nhắn tin không đồng bộ. Bạn có thể gửi tin nhắn, làm những việc khác và kiểm tra lại để trả lời sau. SendMessage là đồng bộ và yêu cầu bạn phải đợi.

+0

Tôi đoán tôi nên nói rằng mục tiêu của tôi là đạt được sự đồng bộ. Tôi sẽ làm PostMessage và làm theo ngay lập tức với một cuộc gọi đến WaitForSingleObject. –

+0

+1 để làm nổi bật sự khác biệt hoạt động chính - PostMessaging một sự kiện và chờ nó cho phép người gọi tiếp tục xử lý. Điều này có thể hữu ích nếu mục tiêu là chờ đợi ở một số giai đoạn sau trong quá trình xử lý luồng cho đến khi một thông điệp được đăng trước đó đã được xử lý hoàn toàn trong luồng GUI. –

3

Tôi luôn nghĩ rằng SendMessage gọi trực tiếp thủ tục cửa sổ của bạn, bỏ qua hàng đợi tin nhắn; trong khi PostMessage chỉ thêm tin nhắn vào hàng đợi.

+3

Điều đó phụ thuộc vào những gì thread SendMessage() được gọi từ. Các cuộc gọi xen kẽ luôn được marshalled thông qua máy bơm, và không được gửi trực tiếp đến winproc. –

2

SendMessage là một cuộc gọi API duy nhất, do đó ít bị lỗi của bạn hơn. Đi với tích hợp hơn là lăn của riêng bạn.

+3

Nó không phải là nó chỉ là ít dễ bị lỗi. Các hàm phục vụ một mục đích ngữ nghĩa rất khác nhau. Lựa chọn của bạn để sử dụng cái này hay cái kia phải dựa trên những gì bạn muốn hoàn thành, không chỉ làm thế nào tôi có thể làm cho đoạn mã này "làm việc" được. –

+0

"Ngữ nghĩa" là ngôn ngữ tự nhiên. Mã là mã gì, không phải những gì nó được cho là có ý nghĩa. –

+1

Không, ngữ nghĩa để tạo điều kiện dễ đọc mã, tự tài liệu và tuân thủ các hợp đồng API. Chỉ vì mã làm một cái gì đó bây giờ không có nghĩa là nó sẽ luôn luôn tiếp tục làm điều tương tự. Và chỉ vì người thực hiện biết mã nào không có nghĩa là người duy trì sau này sẽ biết tại sao bạn làm một cái gì đó theo cách hoàn toàn không rõ ràng, không trực quan. –

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