Question

Est-il possible de traiter tous les messages de Windows alors que le thread d'interface utilisateur est en attente d'un WaitHandle ou un autre filetage primitif?

Je me rends compte que cela pourrait créer des problèmes de désordre très réentrée; Je veux le faire de toute façon.

EDIT : L'attente se produit au milieu d'une fonction complexe qui doit exécuter sur le thread d'interface utilisateur. Par conséquent, déplacer l'attente d'un fil de fond n'est pas une option. (Fractionnement la fonction dans deux serait un gâchis compliqué et ingérable)

Était-ce utile?

La solution

Je courrais l'ensemble « Compliqué fonction qui-peut-pas-être-split » dans un thread d'arrière-plan séparé, et avoir de faire rapport à l'interface utilisateur graphique uniquement lorsqu'il doit (en utilisant des méthodes Invoke / BeginInvoke sur un contrôle).

Dans une version plus améliorée, vous devez exécuter votre fonction compliquée dans un contrôleur non interface utilisateur qui ne dépend pas de l'interface utilisateur, et est plus facile à tester l'unité. Téléphonera pour l'interface utilisateur et de montrer le résultat dans l'interface utilisateur, peut facilement être atteint en ayant l'interface utilisateur pour subrscribe aux événements mis à disposition par le contrôleur.

Autres conseils

Pourquoi ne pas vous frayer juste un autre thread pour l'attente et lui notifier le thread d'interface à la jonction appropriée via un message (ou autre)?

C'est l'approche habituelle pour permettre un message de thread d'interface utilisateur de manipulation lors d'un événement de blocage.

EDIT: Je vois maintenant - vous avez cette logique logique de l'application intégrée dans le code de l'interface utilisateur. Eh bien, cela est vraiment un problème de conception alors. Vous êtes mieux à long terme briser cette fonctionnalité à partir de l'interface utilisateur dans un objet autonome et en utilisant un mécanisme pour communiquer l'état avec l'interface utilisateur de votre travailleur.

En plus de l'avantage de garder votre code d'interface utilisateur axée sur l'interface utilisateur, ce qui vous permet de test d'unité le code logique séparément.

Je ne sais pas à propos de C #, mais dans la programmation Win32 ordinaire, vous pouvez utiliser l'une des fonctions MsgWaitFor ... () pour l'attente réelle. Il vous informera lorsque les messages sont présents dans la file d'attente de messages, ainsi que lors de son attendu sur devenir l'objet (s) signalé. Si elle fait état d'un message est présent, vous pouvez appeler pour traiter un message GetMessage (), TranslateMessage (), et DispatchMessage (), puis revenir à l'attente.

Je vous recommande normalement de mettre votre état d'attente sur un autre fil.

Cependant, cela étant dit, vous pouvez toujours appeler Application.DoEvents pour traiter la pompe de message à tout moment, y compris en « attente » sur une poignée d'attente (délai d'attente juste, faire des événements, attendez avec délai d'attente, etc., jusqu'à ce que vous obtenez « à » l'WaitHandle) .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top