Ho bisogno di qualche consiglio nella codifica corretta:Buona codifica? (Multiple Message Loops)
Sto lavorando su un programma in cui vengono utilizzate più connessioni seriali. Ogni linea di comunicazione ha un controller che funziona come un livello di astrazione. Tra il controller e la porta seriale, viene inserito un protocollo per avvolgere i dati in pacchetti, pronti per il trasferimento. Il protocollo si occupa delle consegne non riuscite, del resending ecc. Per garantire che la GUI non si blocchi, ciascuna linea di connessione (protocollo e porta seriale) viene creata su un thread separato. Il controller è gestito dal thread principale, poiché ha controlli nella GUI.
Attualmente, quando creo i thread, ho scelto di creare un loop di messaggi su di essi (Application.Run()), quindi, anziché interrogare i buffer e restituire se non funziona, semplicemente invoco il thread (BeginInvoke) e utilizza il ciclo del messaggio come buffer. Attualmente funziona bene, e non ci sono ancora problemi seri.
La mia domanda è ora: è questa "buona codifica", o dovrei usare un ciclo while sul battistrada ed essere tampone di interrogazione invece ?, o una terza cosa?
Mi piacerebbe mostrare il codice, ma finora sono diverse migliaia di righe di codice, quindi per favore sii specifico se hai bisogno di vedere qualsiasi parte del codice. :)
Grazie.
Non proprio, no. WM_COPYDATA va bene per la comunicazione tra processi. È inutile usarlo per comunicazioni inter-thread all'interno di un processo. È molto più semplice/semplice passare semplicemente il buffer/blob/qualsiasi oggetto tramite puntatore, ad es. lanciando il * Buffer al messaggio.lParam, PostMessage() ing e ricomincia dall'altra parte. –
Le code dei messaggi di Windows sono ottimizzate per la comunicazione ai thread della GUI. Non sono ottimali per la comunicazione dai thread GUI ai thread di lavoro non-GUI. Anche una semplice coda produttore-consumatore non ottimizzata basata sul semaforo è circa quattro volte più veloce di un WMQ. Nella maggior parte delle app, le prestazioni della coda P-C normalmente non sono comunque un problema. –
Sono d'accordo su entrambi i punti in realtà. Modificherò WM_COPYDATA; Non stavo pensando chiaramente. Per quanto riguarda la coda dei messaggi, si tratta di una soluzione basata su eventi generalizzata. A seconda dei requisiti della sua app, altri modelli potrebbero essere migliori. – tenfour