2015-09-23 13 views
6

Ho implementazione della funzione del client DDE utilizzando Win Api in C#. Tutto funziona bene nel caso in cui io chiami DdeInitializeW e DdeConnect in thread singolo. In particolare, questi sono definizioni involucro:C# Win Api DDE connessione multithread

[DllImport("user32.dll")] 
    protected static extern int DdeInitializeW(ref int id, DDECallback cb, int afcmd, int ulres); 

    [DllImport("user32.dll")] 
    static extern IntPtr DdeConnect(
     int idInst,    // instance identifier 
     IntPtr hszService,  // handle to service name string 
     IntPtr hszTopic,  // handle to topic name string 
     IntPtr pCC    // context data 
     ); 

Se ho chiamato DdeInitializeW e DdeConnect in diversi thread, DdeConnect ritorno puntatore nullo.

Inoltre, se ho chiamato entrambi (connessione DDE stabilita) in un thread, non posso usare questo canale DDE in un altro thread (sto ricevendo l'errore DDE INVALIDPARAMETER).

Come ho detto, tutto funziona senza problemi in thread singolo.

risposta

6

Il comportamento descritto è previsto.

DDE è collegato alla singola filettatura. Ciò è dovuto al fatto che DDE (che in genere è considerato una tecnologia legacy) funziona internamente passando i messaggi di Windows e gli handle di windows (HWND) hanno affinità di thread.

  • È necessario chiamare DdeInitializeW dallo stesso filo si chiama DdeConnect.
  • Quel thread deve pompare i messaggi (quindi non può essere un thread del pool di thread).
  • Otterrete callback/risposte anche su quello stesso thread.

In altre parole è necessario fare la tua DDE da un thread che chiama Application.Run, o che chiama spesso Application.DoEvents nei momenti in cui è opportuno che gli eventi per essere inviati o ricevuti.

È possibile utilizzare DDE da più thread, ma ognuno deve chiamare DdeInitializeW e le risposte verranno sempre ricevute sul thread da cui è stata inviata la richiesta.

+0

Questo è esattamente come lo sto facendo in questo momento. OK avevo paura che questo fosse un problema di DDE stesso. Grazie mille per avermi assicurato. – Majak

+0

Inoltre, mancia se non lo stai già facendo: tieni traccia di più conversazioni DDE dando a ogni conversazione un ID univoco, usando 'DdeSetUserHandle' e' DdeQueryConvInfo'. Questo semplifica tutto molto. https://msdn.microsoft.com/en-us/library/windows/desktop/ms648765(v=vs.85).aspx – Ben