2009-01-16 30 views
5

câu hỏi của tôi là: làm thế nào tôi có thể sử dụng SendMessage() để thực hiện giao tiếp luồng giữa hai luồng, một với cửa sổ (GUI) và cái kia không có cửa sổ?Truyền thông chủ đề bằng cách sử dụng SendMessage

Vấn đề là SendMessage() cần xử lý (HWND)?

Một chi tiết về dự án của tôi: Hai chủ đề, người ta chạy được quản lý mã (một với giao diện người dùng), và các mã nguồn gốc chạy khác (một trong những không có cửa sổ)

Cảm ơn bạn rất nhiều!

+0

SendMessage là một chức năng vô cùng nguy hiểm được sử dụng trong một môi trường đa luồng vì nó không phải là thread-safe và có thể dẫn đến sự bế tắc (Tôi nói từ kinh nghiệm). –

Trả lời

3

Có lẽ bạn nên cố gắng sử dụng PostMessage hoặc PostThreadMessage

+0

Tôi thích PostThreadMessage rất nhiều. Có phiên bản chặn của chức năng này không? Bởi vì PostThreadMessage trả về mà không cần chờ đợi để xử lý thông điệp. –

+0

Không. Sẽ không quá khó để thực hiện một phiên bản chặn - sử dụng PostThreadMessage, và sau đó có khối chuỗi cuộc gọi trên một sự kiện mà callee sẽ đặt khi nó xử lý thông báo –

2

Nếu thread không có cửa sổ, không có hàng đợi thông điệp, và không có điều phối tin nhắn, sau đó nó sẽ được khó khăn để một thông điệp tới nó. Nó là phổ biến cho các chủ đề để tạo ra các cửa sổ ẩn chỉ cho mục đích giao tiếp (hãy xem với Windows Spy và bạn sẽ thấy rất nhiều ví dụ).

Một cách khác là sử dụng bộ nhớ dùng chung và đồng bộ nguyên thủy như một sự kiện hoặc semaphore. Một cách khác là sử dụng đường ống.

2

những gì @jdigital cho biết. Lưu ý rằng nếu bạn tạo một cửa sổ ẩn, và luồng của bạn chưa thực hiện một vòng lặp thông điệp (hoặc trong win32-nói thường xuyên, hoặc một trong bối cảnh của một STA COM - và nếu bạn không có ý tưởng những gì tôi đang nói về thì có lẽ không tồn tại trong chuỗi của bạn), bạn cũng sẽ muốn tạo một vòng lặp tin nhắn. ATL làm cho nó khá dễ dàng với _AtlModule.RunMessageLoop(); Thật không may điều này cũng có nghĩa là các chủ đề trong câu hỏi có lẽ sẽ cần phải được hướng sự kiện trong khi nó là trong vòng lặp tin nhắn. Bạn có thể làm những điều phức tạp như MsgWaitForMultipleObjects, nhưng nó bị lông.

Dưới đây là ví dụ về hidden windows nếu bạn quen thuộc với ATL/COM. Tôi đã trải qua cơn đau này một lúc trước và nghĩ rằng có một cuộc thảo luận hữu ích trên microsoft.public.vc.atl, nhưng tốt nhất tôi có thể tìm thấy bây giờ là this post. trong đó đi vào một số chi tiết về các biến thể của vòng tin nhắn (phải làm gì khác nếu bạn có các máy gia tốc phím hoặc cửa sổ không mod, nghe như bạn không có trong ứng dụng của bạn).

4

Tôi khuyên bạn nên tạo cửa sổ ẩn. Khi sử dụng postthreadmessage, có khả năng tin nhắn của bạn có thể bị mất (ví dụ: nếu một hộp thông báo đang chạy vòng lặp tin nhắn). Thông tin

Thông tin thêm về điều đó tại địa chỉ:

http://blogs.msdn.com/oldnewthing/archive/2005/04/26/412116.aspx

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