IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

Threads STA + pompe à messages


Sujet :

Windows Forms

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 39
    Par défaut Threads STA + pompe à messages
    Bonjour,

    Mon problème est lié à l'utilisation de Threads STA qui fait qu'après un certain tps, mon appli se fixe ... et ne fais plus rien.

    Pour faire simple, j'ai une appli composé de la Form principale contenant un webbrowser, cette Form lance un Thread qui ouvre "Form2" contenant également un webbrowser. A chaque Tick d'un Timer, je raffraichis l'affichage de mes forms en replacant le webbrowser dans la Form principale, et en fermant puis réouvrant la "Form2".

    Le thread qui ouvre Form2 est en mode STA à cause de l'utilisation du Webbrowser.

    J'utilise pour ouvrir la Form "Application.Run(new Form)"

    Voici ci-dessus un aperçu de code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    dim monThread as New System.Threading.Thread(AddressOf ouvreForm2)
    monThread.SetApartmentState(Threading.ApartmentState.STA)
    monThread.IsBackground = True
    monThread .Start()
     
    ....
    Private Sub ouvreForm2
    Application.Run(maForm2)
    End Sub
    Mon problème est qu'après un temps aléatoire, j'ai un message d'erreur qui dit

    Le CLR n'a pas pu effectuer de transition du contexte COM 0x1a43c0 au contexte COM 0x1a4530 pendant 60 secondes.
    Le thread qui possède le contexte/cloisonnement de destination est probablement en train d'attendre ou de traiter
    une opération très longue sans pompage des messages Windows. Cette situation a généralement des effets négatifs
    sur les performances et peut parfois entraîner le blocage de l'application ou
    une utilisation ininterrompue de la mémoire. Pour éviter ce problème, tous les threads STA (Single Threaded Apartment) doivent
    utiliser des primitives d'attente de pompage (par exemple CoWaitForMultipleHandles) et pomper de manière régulière
    les messages lors des opérations qui sont longues à s'exécuter.
    J'ai cherché sans succès sur le net/forum pour trouver une solution, comment puis-je créer une pompe à message (par exemple CoWaitForMultipleHandles) ? ou comment puis-je faire que ca marche

    Merci d'avance à ceux qui prendront le temps de lire ce message.

  2. #2
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Citation Envoyé par mexong Voir le message
    A chaque Tick d'un Timer, je raffraichis l'affichage de mes forms en replacant le webbrowser dans la Form principale, et en fermant puis réouvrant la "Form2".
    Quoi ?!
    Qu'appelles tu "rafraichir" ? pourquoi fermer et réouvrir la Form2 ? Et pourquoi le faire avec Application.Run alors que tu devrais faire LaForm2.ShowDialog() ?

  3. #3
    Membre confirmé Avatar de Legarsdelouest
    Homme Profil pro
    Work Package Manager
    Inscrit en
    Août 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Work Package Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2009
    Messages : 52
    Par défaut
    Je pense que la commande Refresh() serai plus adapté. Sa t'éviterai de passer par un thread un un second form inutile.

    Ou alors tu fais en sorte qu'a chaque tick de ton timer, le webrowser se redirige vers la même url, ce qui le forcerai a se réactualiser

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 39
    Par défaut
    Qu'appelles tu "rafraichir" ? pourquoi fermer et réouvrir la Form2 ?
    En fait, pour faire simple (j'ai un peu raccourci le fonctionnement de l'appli), lorsque je dis "rafraichir", en ce qui concerne la FormPrincipale, cela signifie que je change le ou les usercontrol qu'elle contient, cela peut être un webbrowser, un richtextbox, ...

    Form2 contient un bandeau défilant, lorsque le bandeau a fini de défiler, la Form ré-appel la fonction d'affichage qui ferme la form2 et en ré-ouvre une avec le message suivant...

    pourquoi fermer et réouvrir la Form2 ?
    Euh, ben aucune raison spéciale ...

    Et pourquoi le faire avec Application.Run alors que tu devrais faire LaForm2.ShowDialog() ?
    Ben, en fait, à la base j'utilisez "Form2.Show()" mais cela engendrer des problèmes car l'affichage n'était pas réellement dans un Thread séparé, grâce à Pol63 (voir mon précédent post, j'ai découvert Application.Run et ca fonctionné, à la suite de recherche, je suis tombé sur ".showDialog()", ce week-end, j'ai fait un test avec Application.Run et un avec form2.showDialog.... et verdict les 2 ont plantés .

    En fait, je n'ai pas bien saisi la différence entre showDialog et application.Run, est-ce qu'elle se situe justement au niveau de la "pompe à message" ?

    Je pense que la commande Refresh() serai plus adapté.
    J'ai décidé de passer par un Thread séparé car mon problème est que la FormPrincipal contient un flash gourmand qui à l'affichage faisait ralentir (voir s'arreter) mon bandeau défilant présent dans la Form2.

    (j'ai détaillé un peu plus ce problème dans mon précédente discussion http://www.developpez.net/forums/d79...-p-multi-core/

Discussions similaires

  1. Qu'est ce que la pompe à messages d'une application?
    Par Leemon dans le forum Windows Forms
    Réponses: 4
    Dernier message: 29/03/2007, 15h01
  2. [Thread]Queue de messages
    Par homeostasie dans le forum Visual C++
    Réponses: 2
    Dernier message: 15/12/2006, 13h38
  3. Pompe à messages
    Par Rupella dans le forum MFC
    Réponses: 2
    Dernier message: 12/03/2006, 12h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo