Comment puis-je mettre en œuvre deux threads d'interface utilisateur dans une application Windows C# ?
Réponses
Trop de publicités?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().
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.