2012-12-07 2 views
1

Dans l'application sur laquelle je travaille, il existe plusieurs formes; un utilisé pour afficher des images en 3D, et d'autres pour gouverner cela. Certains changements dans les images prennent du temps, et pendant qu'ils sont en cours, les deux formes ne sont pas redessinées. Ce que je voudrais réaliser est au moins pour la forme de contrôle (qui est composée de composants assez standard seulement) pour continuer l'interaction avec l'utilisateur et continuer à être redessiné. La façon dont je le vois, il devrait être déplacé dans un fil différent, car le fil qu'il utilise maintenant est trop occupé.Winforms application avec des formes dans différents threads

Comment devrais-je faire cela? Wil Application.Run (secondForm) est-il suffisant?

+0

Le bloc 'Application.Run' n'est-il pas bloqué? –

+0

Après avoir vérifié msdn, il semble que oui, c'est le cas. Probablement l'appeler de l'intérieur d'un autre thread fera l'affaire. – Srv19

+0

Ce n'est pas un doublon, mais je pense que vous pourriez obtenir un bon début à partir de cette [question] (http://stackoverflow.com/questions/7568376/multiple-ui-threads-winforms?rq=1) – Steve

Répondre

2

Vous devriez faire le levage lourd dans un autre fil. Vous pouvez utiliser un agent d'arrière-plan pour garder les choses simples ou gérer vos propres threads.

Quelque chose comme ceci:

  • presses form Controller start => Démarrer un fil/BackgroundWorker et faire vos calculs dans ce
  • Lorsque les calculs sont effectués, mettez à jour votre formulaire d'image. Vous pouvez appeler un événement quand c'est fait et laisser votre formulaire image/contrôleur s'y abonner.
  • Ou lorsque le formulaire du contrôleur change quelque chose avant que les calculs ne soient effectués, vous pouvez annuler l'arrière-plan et recommencer.
0

Habituellement, il est préférable de décharger le levage lourd sur un BackgroundWorker, comme Carra suggested.

Mais pour répondre directement à votre question, oui, pouvez mettre un formulaire dans un fil séparé. Ce n'est peut-être pas idéal dans ce cas, car votre fenêtre d'arrière-plan serait toujours non réactive la plupart du temps; mais c'est possible.

Vous voudriez utiliser un Thread créé manuellement (et non par exemple un Task ou un fil ThreadPool), et assurez-vous d'appeler Thread.SetApartmentState (ApartmentState.STA) avant de commencer le fil, puisque la plupart UI nécessite un appartement filé. Ensuite, vous pouvez créer un formulaire à l'intérieur de ce thread, et appelez Application.Run ou Form.ShowDialog.

Bien sûr, toutes les restrictions de threading habituelles s'appliquent (peuvent uniquement accéder au formulaire et à ses contrôles à partir du thread qui les a créées).

Questions connexes