4 votes

Deux threads d'interface utilisateur dans une application Windows C#

Comment puis-je mettre en œuvre deux threads d'interface utilisateur dans une application Windows C# ?

7voto

Hans Passant Points 475940

Vous devez appeler Thread.SetApartmentState() pour faire passer le thread en STA avant de le démarrer. Et pomper une boucle de messages pour maintenir en vie toute fenêtre créée sur ce thread, Application.Run(). Application.ExitThread() mettra fin à la boucle de messages et fera sortir le thread. L'utilisation de Run(Form) rend cette opération automatique, tout comme pour le thread principal.

Attention toutefois, l'utilisateur risque d'avoir du mal à gérer les fenêtres que vous créez sur ce fil. Elles n'ont pas de relation d'ordre Z avec les fenêtres du fil principal, le bureau est leur parent. Elles ont donc tendance à se perdre facilement derrière une autre fenêtre, y compris la vôtre. Les solutions de contournement les plus maladroites sont TopMost et le recours à SetParent().

5voto

Erno de Weerd Points 30391

Il ne s'agit peut-être pas d'une réponse mais plutôt d'une explication.

Si deux threads étaient autorisés à accéder au même pixel en même temps - ce qui serait une conséquence de l'utilisation d'une interface utilisateur multithread - il faudrait une sorte de synchronisation entre les threads. Si les threads ne se synchronisent pas, comment déterminer la couleur d'un pixel ?

Il faudrait donc ajouter le verrouillage. Le verrouillage par pixel étant très coûteux, nous passerions rapidement au verrouillage par contrôle ou par fenêtre. Et voilà : en autorisant 1 et seulement 1 thread à accéder à l'interface utilisateur, nous avons mis en place le verrouillage.

BTW : remplacez pixel par contrôle ou arbre de contrôle ; il ne s'agit pas seulement de pixels, mais de données partagées, qu'il s'agisse d'un pixel ou d'un contrôle.

1voto

josef.axa Points 626

Appelez Application.Run(...) dans un nouveau fil et il ouvrira le formulaire avec sa propre boucle de messages.

new Thread(() => Application.Run(someForm)).Start();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X