Dans quelles langues / plates-formes Invoke pour les opérations de l'interface graphique requise?

StackOverflow https://stackoverflow.com/questions/589680

Question

Je comprends que dans .NET, il faut utiliser Control.Invoke (délégué) pour effectuer des opérations sur un contrôle. Cela me conduit à se demander où les environnements Invoke est réellement nécessaire. Pour autant que je sache, il n'a pas été nécessaire dans les anciennes versions, par exemple, Visual Basic et Pascal. En particulier, quel est l'état de Java (peut-être dépendant de la version?) Et les fenêtres « de style ancien » programmation GUI (lecture manuellement la file d'attente de messages)?

Était-ce utile?

La solution

Dans la plupart des langues Invoke pour les opérations de l'interface graphique est nécessaire. En Java il y a SwingUtilities.invokeLater . En fait, un procédé comme cela serait nécessaire dans un environnement si plusieurs fils sont utilisés. La raison en est que le principal thread d'interface utilisateur exécute un mécanisme de notification d'événements. Un second fil d'être en mesure d'interagir avec ce mécanisme doit de toute façon être synchronisé avec elle.

Ces méthodes sont en fait invoquer une commodité pour le développeur. Dans les plates-formes qui n'existent pas, cela ne signifie pas que est autorisé à accéder aux éléments UI d'un autre thread. Il peut signifie simplement que le promoteur doit mettre en place un mécanisme de mesure (envoi d'événements) de le faire. le code de l'interface utilisateur est thread très rarement en sécurité. J'ai travaillé avec de nombreuses plates-formes et technologies et je suis toujours en suivant cette règle. Toucher l'interface utilisateur d'un seul seul fil

Autres conseils

Vous vous trompez. Control.Invoke n'est pas nécessaire d'effectuer des opérations sur un contrôle.

Control.Invoke est un outil utile pour aider le code Marshall à travers les frontières de fil, mais ce n'est pas la seule façon de le faire. Vous verrez cela utilisée le plus souvent quand vous faites un travail dans un thread d'arrière-plan.

Lorsque vous appelez le code à partir d'un fil d'arrière-plan qui doit mettre à jour un contrôle fenêtré (qui est un contrôle qui a une poignée de fenêtre Windows et traite les messages via une pompe de message), modifier ses propriétés, ou une autre manipulation de la commande vous doit passer le contrôle au fil de MessagePump, et Control.Invoke est un moyen utile pour acocmplish que.

ALL programmes qui fonctionnent sous Windows, vous ne pouvez pas appeler des fonctions qui mettent à jour des contrôles sur un fil d'arrière-plan. Certaines langues peuvent gérer ce détail en arrière-plan, mais je ne connais pas de qui le font.

Invoke est juste un wrapper autour de l'API Win32 PostMessage. Seul le thread qui possède une fenêtre est autorisé à accéder à la fenêtre. Ceci est l'héritage va tout le chemin du retour à lorsque Windows était seul thread. Cela signifie que PostMessage est la bonne façon d'accéder à une véritable fenêtre sur Windows, peu importe ce que vous utilisez (VB6, Delphi, .NET, ou autre), mais les différents langages de programmation fournir des emballages pour rendre la vie plus facile pour nous.

En fait, non. Il est nécessaire que si vous êtes l'interface graphique fonctionne plus de 1 fil. Avec WinForm (et WPF) des applications de l'interface graphique fonctionne sur un seul thread STA fileté (cette date de COM et ne me demandez pas pourquoi il est comme ça, parce que je ne sais vraiment pas).

Si vous essayez d'appeler des objets créés sur le thread STA à partir d'un autre thread, il y a des contrôles en place pour assurer une exception est levée. Cette même chose avec WPF bien, WPF en fait beaucoup plus élégant.

Quoi qu'il en soit, vous pouvez réellement vérifier quand Invoke est nécessaire car il y a une propriété pour cela. Ce modèle a été suggéré pour aider à traiter plusieurs threads dans les applications WinForm.

public void MyTextSetMethod(string text)
{
    if(control.InvokeRequired)
    {
        control.Invoke(new Action<string>(MyTextSetMethod), text);
    }
    else
    {
        control.Text = text;
    }
}

Le code ci-dessus fournit une méthode tout autour pour définir la propriété Text, vous pouvez adapter ce pour répondre à vos besoins.

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