2009-10-14 5 views
1

Vous ne pouvez pas accéder aux contrôles gui à partir d'un thread sur lequel ils n'ont pas été créés, du moins dit le message d'une exception qui est parfois déclenchée lorsque vous le faites. Récemment, j'ai été intrigué en voyant que les formulaires créés sur les threads de fond fonctionnent très bien. Mon modèle mental était que toutes les actions initiées par l'interface utilisateur sont traitées sur le thread graphique. Cliquer sur un bouton sur un tel formulaire devrait déclencher l'exception redoutée (le formulaire et tous ses contrôles ont été créés sur un thread d'arrière-plan, pas le thread gui), mais ce n'est pas le cas. Quelque chose ne va pas avec ma carte.Création d'un formulaire sur un thread non-gui

(*) et pour être honnête j'ai vu un problème où l'ouverture de la boîte de dialogue standard de fichier ouvert a été tout blocage

Répondre

1

La restriction est que l'interaction avec un élément d'interface utilisateur doit se produire sur la bande de roulement qui l'a créé. Cela ne signifie pas que vous ne pouvez pas créer un formulaire sur un thread d'arrière-plan. Cependant, toute interaction avec cela doit se produire sur ce thread d'arrière-plan. Tant que vous vous assurez de faire cela (en utilisant InvokeRequired et Invoke au besoin), vous pouvez aller de l'avant et le faire.

J'ai un échantillon de faire cela dans un blog post que j'ai fait il y a un moment.

0

La raison pour laquelle je n'ai rien vu de mal était parce que l'exception n'est levée que si vous l'activez. Il y a une propriété statique sur le contrôle appelée CheckForIllegalCrossThreadCalls, False par défaut. Le document indique:

Lorsqu'un thread autre que le thread créateur d'un contrôle tente d'accéder à l'une des méthodes ou propriétés de ce contrôle, cela conduit souvent à des résultats imprévisibles. Une activité de thread invalide courante est un appel sur le mauvais thread qui accède à la propriété Handle du contrôle. Définissez CheckForIllegalCrossThreadCalls sur true pour rechercher et diagnostiquer plus facilement cette activité de thread.
Questions connexes