Multi Thread sur pages MDI : Besoin d'aide !

Résolu
guilleto Messages postés 256 Date d'inscription jeudi 23 octobre 2003 Statut Membre Dernière intervention 20 mars 2013 - 19 mai 2011 à 10:37
guilleto Messages postés 256 Date d'inscription jeudi 23 octobre 2003 Statut Membre Dernière intervention 20 mars 2013 - 20 mai 2011 à 22:22
Bonjour à toutes et tous,

J'ai actuellement une application qui fonctionne avec une page MDI Parent et (pour l'instant) 3 feuilles MDI filles, dans chacune de ces feuilles filles j'ai un Timer avec des intervalles différents.
Ces 3 Timers interrogent des BdD de type SQLite sur un serveur.
Au vu de la quantité d'information contenues dans ces BdD, mes pages 'lagguent' !
Je souhaites passer en mode threading mais j'ai quelques soucis : A priori les BackGroundWorker mis en lieu et place des Timers fonctionnent mais chacun des codes contient des actions sur la Feuille MDI Parent et c'est là qu'est le problème !
J'ai un message d'erreur qui apparaît sur une ligne de code du style :
FeuilMDI_Parent.UnLabel.text = "ALERTE !"
Il me demande de consulter Exception.InnerException car l'erreur s'est produite lors de la création du formulaire et qu'il est impossible d'instancier le contrôle ActiveX '8856f961-340a-11d0-a96b-00c04fd705a2' car le Thread actuel n'est pas un Thread cloisonné (STA, Single-Threaded Apartment).

Que puis-je faire pour corriger cela ?

Quelqu'un aurait un bout de code avec des explications qui me permettrait de comprendre pourquoi j'ai ce genre de chose ?

J'ai fait pas mal de recherche, et j'avoue ne pas tout comprendre (Thread MDA/SDA) !

Par avance merci

Olivier

4 réponses

NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
20 mai 2011 à 20:46
Bonjour,

Je te conseil cette lecture :
http://msdn.microsoft.com/en-us/library/ms171728%28v=vs.80%29.aspx

Il se peut que ton problème ne vienne pas de là, mais on ne sait jamais.

3
guilleto Messages postés 256 Date d'inscription jeudi 23 octobre 2003 Statut Membre Dernière intervention 20 mars 2013 1
20 mai 2011 à 22:22
Bonsoir NHenry,

Merci pour le lien, j'y suis allé et j'avoue sans honte que c'est assez indigeste pour mon niveau !

J'ai toutefois réussi à contourner le problème à savoir : puisqu'un élément ne pouvait pas être mis à jour sur une Form principale à partir d'une Form Fille sur laquelle était mis en place un BackGroundWorker, j'ai donc mis les BGW sur la Form Principale, placé dans BGW_Progress un élément indiquant les informations utiles à la Form principale sous forme de Variable !

Je suis persuadé qu'il y a mieux, plus propre mais à mon niveau je trouve cela déjà bien que ça fonctionne. Amené à revenir souvent pour des améliorations je penses que je ferais mieux la prochaine fois et peut-être qu'à ce moment le lien que tu m'as laissé me semblera moins indigeste qu'aujourd'hui !

Encore merci pour ton aide

Olivier
3
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
19 mai 2011 à 13:01
Bonjour,

Le multithreading est complexe à gérer.

Dans le framework, il y a une limitation (volontaire) qui bloque la modification des composant graphique aux autres threads que celui qui a créé le composant.

Dans ce cas, regardes l'état de InvokeRequired du contrôle ciblé, si c'est à True, Appelles la fonction Invoke du contrôle en lui passant un delegate et les données des paramètres.

Je ne me rappel plus de l'exception générée.

Dans tous les cas, il faut que tu regardes dans InnerException, tu aura, je pense, plus d'information.

0
guilleto Messages postés 256 Date d'inscription jeudi 23 octobre 2003 Statut Membre Dernière intervention 20 mars 2013 1
20 mai 2011 à 09:36
Merci nHenry,

Mais j'avoue que cela reste flou pour moi !

Ce que je cherche à faire est la chose suivante :
Avoir un programme principal appelant 'N' Threads indépendants qui ne s'arrêtent jamais et qui retournent des informations au programme principal.

Je ne sais pas si je suis assez clair.

Par avance merci

Olivier
0
Rejoignez-nous