2010-05-26 2 views
5

Sto lavorando a un progetto che prevede il riutilizzo e la migrazione di alcuni codici MFC esistenti in C#.Thread in C# - Inserimento di messaggi tra thread

Il codice corrente in MFC crea alcuni thread e utilizza :: PostthreadeMessage() e ON_THREAD_MESSAGE (msg, func) per la comunicazione asincrona tra thread tramite i messaggi.

:: PostthreadeMessage() -> invia un messaggio a un determinato ID di thread. ON_THREAD_MESSAGE (msg, func) -> chiama la funzione (func) quando viene ricevuto un messaggio (msg).

Dato che non conosco molto le interfacce di threading in C#, ho provato a cercare API simili in C#, ma non sono riuscito a trovarne.

Sarebbe bello, se qualcuno mi può aiutare a trovare le funzioni appropriate per questo scopo in C#

+0

che si basa sul thread ricevente che ha una pompa msg (e quindi una finestra) non lo fa? –

risposta

1

Ecco il consiglio da C# MVP Nicholas Paldino:

Se stai postando il filo, e non a una finestra specifica, quindi è necessario avere qualcosa che implementa l'interfaccia IMessageFilter e quindi passare l'implementazione al metodo statico AddMessageFilter sullo Classe applicazione, quindi è in grado di gestire il messaggio che viene fornito nel thread .

Dall'altro thread, si avrà per utilizzare il metodo API PostThreadMessage tramite il livello P/Invoke.

+1

Esiste un rischio per questo approccio. PostThreadMessage pubblica un messaggio utilizzando il threadId, ma la relazione tra threadId e un thread gestito non viene corretta. Da MSDN "Un ThreadId del sistema operativo non ha una relazione fissa con un thread gestito, perché un host non gestito può controllare la relazione tra thread gestiti e non gestiti." http://msdn.microsoft.com/en-us/library/74169f59.aspx –

+0

Grazie a Chris e Mitch !!! Servono solo un paio di ulteriori chiarimenti sui vostri suggerimenti. Hai menzionato l'API PostThreadMessage. È quello da dll user32, che posso dllimport e usarlo? Se sì, allora dove esattamente dovrei implementare l'interfaccia IMessageFilter e perché? Senza implementarlo, non posso importare il messaggio getmessage e postthread da dll utente32 e usarlo? Grazie! – Harsha

1

Vi consiglio di non eseguire una porta diretta per questa parte dell'applicazione (comunicazione tra thread). Potrebbe essere possibile controllare se è possibile utilizzare i delegati e gli eventi. Un delegato potrebbe essere registrato all'avvio e questi delegati (callback) potrebbero essere chiamati al posto del messaggio dell'utente.

1

Se entrambi i thread sono in C# e si è su .NET 4, utilizzerei semplicemente un ConcurrentQueue<T> e accoderei messaggi da un thread e li consumeremo sull'altro.

+0

Grazie per le informazioni !! Sono su .NET3.5. I miei thread verranno creati in C# e devono comunicare tra loro.Ogni thread userà anche qualche dll MFC, e da quel codice MFC, voglio comunicare all'altro thread in C# usando l'id del thread. Spero che ti dia qualche idea !!! – Harsha