In un'applicazione Windows Form C #: in che modo il pump dei messaggi utilizza il thread dei controlli principale / modulo per aggiornare il modulo?

1

Da quanto ho capito, il modulo e tutti i relativi controlli grafici vengono eseguiti sul thread principale. Il modulo viene visualizzato dal thread principale e gli input da tastiera e mouse vengono ricevuti tramite il pump dei messaggi e vengono eseguiti sullo stesso thread principale. Credo anche che il codice che scrivi sia eseguito sullo stesso thread, a meno che tu non crei altri thread per l'esecuzione. Ad esempio, il codice che scrivi nel costruttore Form1 () verrà eseguito sullo stesso thread. Se crei un ciclo senza fine su quel thread, la GUI non verrà mai visualizzata.

In che modo il codice che scrivi per quel thread più gli eventi di input ricevuti dal pump dei messaggi vengono eseguiti tutti nello stesso thread? Inoltre, quando si utilizza Invoke su un delegato affinché venga eseguito sul thread principale, come viene eseguito sul thread principale quando il thread principale ha già un elenco di istruzioni in esecuzione. Non capisco come un thread possa avere una lista di istruzioni che sta eseguendo e quindi ricevere alcune istruzioni da un'altra parte per l'esecuzione. Ha il codice per controllare periodicamente (tra l'esecuzione di altre istruzioni) qualche coda? Posso capire se 2 percorsi di esecuzione sono eseguiti su thread diversi, ma non capisco che si trovano sullo stesso thread.

    
posta WZRh1jq91 18.08.2017 - 23:02
fonte

1 risposta

1

L'unico modo in cui è possibile scrivere il codice per il thread del pump dei messaggi, comunemente chiamato thread User Interface (UI), consiste nel mettere il codice in callback guidati dagli eventi. Questi sono eventi nella terminologia C #. Alcuni eventi oltre a mouse, tastiera, ecc. Includono l'evento di inattività (Application.Idle), che viene chiamato quando non ci sono altri input da inviare.

Il delegato da inviare sul thread dell'interfaccia utente verrà eseguito in modo simile a un gestore Application.Idle o bloccandolo fino al completamento del delegato. C'è solo uno stack per il thread dell'interfaccia utente, quindi può eseguire solo uno stack di chiamate alla volta. Il thread può essere anticipato per l'esecuzione di altri thread, ma questo non eseguirà codice aggiuntivo per il thread dell'interfaccia utente.

Detto questo, a volte troverai il codice di rientro nelle applicazioni di Windows Form. Ci sono alcune chiamate che puoi fare che possono causare questa situazione. Application.DoEvents () può causare l'invio di eventi all'interno dello stack di chiamate di un gestore di eventi. Questo solo approfondisce la pila; non coinvolge altri thread.

    
risposta data 19.08.2017 - 01:25
fonte

Leggi altre domande sui tag