2010-05-26 33 views
5

Tôi đang làm việc trên một dự án liên quan đến việc tái sử dụng cũng như di chuyển một số mã MFC hiện có sang C#.Chủ đề C# - Đăng thông điệp giữa các chủ đề

Mã hiện tại trong MFC, tạo một số chủ đề và sử dụng :: PostthreadeMessage() và ON_THREAD_MESSAGE (msg, func) cho liên lạc không đồng bộ giữa các luồng thông qua tin nhắn.

:: PostthreadeMessage() -> gửi thư đến một id chuỗi cụ thể. ON_THREAD_MESSAGE (msg, func) -> gọi hàm (func) khi nhận được tin nhắn (msg).

Vì tôi không biết nhiều về các giao diện luồng trong C#, tôi đã cố tìm kiếm các API tương tự trong C#, nhưng không thể tìm thấy bất kỳ giao diện nào.

Nó sẽ là tuyệt vời, nếu ai đó có thể giúp tôi trong việc tìm kiếm các chức năng phù hợp cho mục đích này trong C#

+0

dựa trên chuỗi nhận có máy bơm msg (và do đó một cửa sổ) có hoạt động không? –

Trả lời

1

Dưới đây là những lời khuyên từ C# MVP Nicholas Paldino:

Nếu bạn đang gửi bài đến các chủ đề, và không đến một cửa sổ cụ thể, sau đó bạn sẽ phải có một cái gì đó mà triển khai giao diện IMessageFilter và sau đó vượt qua việc thực hiện đó để thực hiện phương thức tĩnh AddMessageFilter trên Lớp ứng dụng, do đó, nó có thể xử lý thông báo đi kèm trên chuỗi .

Từ chủ đề khác, bạn sẽ có để sử dụng phương thức PostThreadMessage API thông qua lớp P/Gọi.

+1

Có nguy cơ đối với phương pháp này. PostThreadMessage đăng một thông báo bằng cách sử dụng threadId, nhưng mối quan hệ giữa threadId và một luồng được quản lý không cố định. Từ MSDN "ThreadId hệ điều hành không có mối quan hệ cố định với một luồng được quản lý, bởi vì một máy chủ không được quản lý có thể kiểm soát mối quan hệ giữa các luồng được quản lý và không được quản lý." http://msdn.microsoft.com/en-us/library/74169f59.aspx –

+0

Nhờ Chris và Mitch !!! Chỉ cần một vài giải thích rõ hơn về đề xuất của bạn. Bạn đã đề cập đến API PostThreadMessage. Là một trong những từ user32 dll, mà tôi có thể dllimport và sử dụng nó? Nếu có thì tại đâu chính xác tôi nên triển khai giao diện IMessageFilter và tại sao? Nếu không thực hiện nó, tôi không thể nhập getmessage và postthreadmessage từ user32 dll và sử dụng nó? Cảm ơn! – Harsha

1

Tôi sẽ khuyên bạn không nên thực hiện cổng trực tiếp cho phần này (liên lạc chuỗi liên lạc) một phần của ứng dụng. Có thể bạn có thể kiểm tra xem bạn có thể sử dụng đại biểu và sự kiện không. Một đại biểu có thể được đăng ký khi khởi động và các đại biểu (callbacks) có thể được gọi thay vì thông điệp người dùng.

1

Nếu cả hai chuỗi của bạn nằm trong C# và bạn đang sử dụng .NET 4 Tôi sẽ chỉ sử dụng một số ConcurrentQueue<T> và xếp hàng các thư từ một chuỗi và sau đó sử dụng chúng trên một chuỗi khác.

+0

Cảm ơn thông tin !! Tôi đang trên .NET3.5. Chủ đề của tôi sẽ được tạo trong C# và cần giao tiếp với nhau.Ngoài ra mỗi thread sẽ sử dụng một số dll MFC, và từ đó mã MFC, tôi muốn giao tiếp với các chủ đề khác trong C# bằng cách sử dụng thread id. Hy vọng nó sẽ mang lại cho bạn một số ý tưởng !!! – Harsha

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