Tôi đã tự hỏi có gì khác biệt giữa việc gọi SendMessage (chặn) và gọi PostMessage cùng với WaitForSingleObject. Suy nghĩ?SendMessage vs PostMessage + WaitForSingleObject
Trả lời
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()
và 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.
PostMessage
và WaitForSingleObject
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.
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. –
+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. –
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.
Đ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. –
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.
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. –
"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. –
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. –
- 1. SendMessage vs. WndProc
- 2. .Net Timeout: WaitForSingleObject vs Timer
- 3. Chrome Extensions - onRequest/sendRequest vs onMessage/SendMessage
- 4. Tôi không thể hiểu cách sử dụng các cuộc gọi SendMessage hoặc PostMessage
- 5. Tìm kiếm chức năng PostMessage trong Qt
- 6. Cách sử dụng WaitForSingleObject
- 7. SendMessage (HWND_BROADCAST treo
- 8. thể một SetEvent đơn() kích hoạt nhiều WaitForSingleObject()
- 9. jQuery không hỗ trợ sự kiện postmessage?
- 10. Giải thích về số tin nhắn SendMessage?
- 11. Cách tạo lParam của SendMessage WM_KEYDOWN
- 12. Lợi ích của việc sử dụng WaitForSingleObject khi kiểm tra quá trình ID
- 13. javascript: nghe các sự kiện postMessage từ iframe cụ thể
- 14. PostMessage với nhiều chức năng hoặc gọi lại tùy chỉnh
- 15. iframe nhắn miền chéo với jQuery postMessage Plugin
- 16. PostMessage từ WorkerThread đến cửa sổ chính trong MFC
- 17. Tôi làm cách nào để thực hiện postMessage đa miền?
- 18. Truyền thông chủ đề bằng cách sử dụng SendMessage
- 19. Cách thực thi một SendMessage từ một luồng khác?
- 20. WM_COPYDATA SendMessage - Nó có thể gửi các chuỗi lớn không?
- 21. Mutex vs tổ chức sự kiện trong Windows
- 22. WaitForSingleObject có phục vụ như một rào cản bộ nhớ không?
- 23. iframe chiều cao động chiều cao miền chéo bằng cách sử dụng jquery.ba-postmessage
- 24. cách kiểm tra từ iframe crossdomain tin nhắn (postMessage) đến từ đâu?
- 25. Làm cách nào để tìm ra ai được gọi là SendMessage?
- 26. J2ME VS Android VS iPhone VS Symbian VS Windows CE
- 27. Exec vs ExecWait vs ExecShell vs nsExec :: Exec vs nsExec :: ExecToLog vs nsExec :: ExecToStack vs ExecDos vs ExeCmd
- 28. bigtable vs cassandra vs simpledb vs dynamo vs couchdb vs hypertable vs riak vs hbase, họ có điểm gì chung?
- 29. ACE vs Boost vs Poco vs wxWidgets
- 30. NetSqlAzMan vs AzMan vs (?????)
Nếu bạn muốn đồng bộ hóa, hãy gọi SendMessage. –