Domanda

C'è un modo per elaborare tutti i messaggi di Windows mentre il thread dell'interfaccia utente è in attesa su un WaitHandle o altro filettatura primitiva?

Mi rendo conto che potrebbe creare problemi rientranza molto disordinato; Io voglio fare lo stesso.

Modifica : L'attesa si verifica nel bel mezzo di una funzione complessa che deve essere eseguito sul thread dell'interfaccia utente. Pertanto, spostando l'attesa per un thread in background non è un'opzione. (Dividere la funzione in due farebbe un complicato e impossibile da mantenere disordine)

È stato utile?

Soluzione

mi piacerebbe correre l'intero "Complicated-funzione-che-può-non-essere-split" in un thread in background separata, e l'abbiano in relazione alla GUI solo quando è necessario (utilizzando metodi Invoke / BeginInvoke su un controllo).

In una versione più avanzata, è necessario eseguire la funzione complicata in un controller non di interfaccia utente che non dipende l'interfaccia utente, ed è più facile da test di unità. Richiamare per l'interfaccia utente e che mostra il risultato nell'interfaccia utente, può essere facilmente raggiungibile da avere l'interfaccia utente per subrscribe agli eventi messi a disposizione dal controller.

Altri suggerimenti

Perché non si solo generare un altro thread per fare l'attesa e lo hanno notificare al thread dell'interfaccia utente tramite messaggio (o altro) al momento opportuno?

Questo è l'approccio abituale per consentire per la gestione durante un evento di blocco messaggio thread dell'interfaccia utente.

EDIT: Vedo ora - si dispone che la logica logica app integrata nel codice utente. Bene, questo è davvero un problema di progettazione poi. È meglio nel lungo periodo di rottura che la funzionalità fuori dall'interfaccia utente in un oggetto autonomo e con qualche meccanismo per comunicare lo stato con l'interfaccia utente dal lavoratore.

A parte il vantaggio di mantenere il codice UI focalizzata sulla UI, questo ti permette di unità di test del codice logica a parte.

Non sei sicuro di C #, ma in parole povere la programmazione Win32, è possibile utilizzare uno dei MsgWaitFor ... () funzioni per l'attesa vera e propria. Esso ti avviserà quando i messaggi sono presenti nella coda dei messaggi, così come quando l'oggetto (s) essere serviti diventare segnalato. Se si riporta un messaggio è presente, è possibile chiamare GetMessage (), TranslateMessage (), e DispatchMessage () per elaborare un messaggio, e poi tornare ad aspettare.

Mi piacerebbe normalmente consiglio mettere la vostra condizione di attesa su un altro thread.

Tuttavia, detto questo, si può sempre chiamare Application.DoEvents per elaborare il messaggio pompa in qualsiasi momento, anche durante 'in attesa' su una maniglia di attesa (solo timeout, fare eventi, attendere con timeout, ecc, fino ad arrivare 'attraverso' la WaitHandle) .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top