Anakkin
Messages postés10Date d'inscriptionmardi 11 février 2003StatutMembreDernière intervention19 mars 2008
-
5 oct. 2007 à 12:03
Anakkin
Messages postés10Date d'inscriptionmardi 11 février 2003StatutMembreDernière intervention19 mars 2008
-
19 mars 2008 à 18:21
Bonjour,
J'ai un probleme avec un module qui contient des fonctions pour la gestion du thread.
Mon formulaire principal contient un textbox et un bouton.
Le bouton contient cette fonction:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
lance_verif()
End Sub
Lance_Verif() est contenue dans le module Thread.vb:
Public Sub lance_verif()
Thread_connexion = New Threading.Thread(AddressOf Serveur_connexion)
Thread_connexion.Start()
End Sub
Jusque la ca va. Le thread lance donc en fond la fonction Serveur_connexion, qui se trouve aussi dans le module thread.vb:
Public Sub Serveur_connexion()
Main.Invoke(New AfficheNotifHandler(AddressOf Trace_notif), "Connexion au Serveur en cours ...")
End Sub
La fonction trace_notif permet d'afficher dans le textbox mon commentaire. Elle fonctionne parfaitement.
Mon probleme demeure sur le Invoke: "Impossible d'appeler Invoke ou BeginInvoke sur un contrôle tant que le handle de fenêtre n'a pas été créé."
Ca marchparfaitement quand je deplace ce code dans le main.vb, mais dans le module thread.vb non.
Anakkin
Messages postés10Date d'inscriptionmardi 11 février 2003StatutMembreDernière intervention19 mars 2008 19 mars 2008 à 09:14
Bonjour,
Malhereusement non, Je n'ai pas trouvé de moyen pour sortir les fonctions deleguée du formulaire ou elles vont etre appeler.
J'avoue ne pas avoir investigué plus. J'ai essayé de faire diverses manieres mais la seule qui fonctionne, c'est quand tout est contenu dans le meme formulaire (excepté les declaration des threads qui sont dans le module).
Si jamais tu trouves quelque chose de mieux, tiens moi au courant !
DominicLavoie
Messages postés4Date d'inscriptionmercredi 9 juin 2004StatutMembreDernière intervention19 mars 2008 19 mars 2008 à 17:12
Bonjour Anakkin,
Voici la solution que j’ai trouvé afin de pouvoir passer dans un module une partie du code initialisé par une form en employant le multithreading. Grosso modo, ce n’est pas la form 1 qui est l’objet de démarrage de l’application. On passe plutôt, par exemple, par une sub main définie dans un module global qui va créer un objet de type form qui va pouvoir être référencé tout au long du code.
C'est pas mal compliqué et le développeur qui travaille avec moi m'a pas mal aidé à décortiquer tout ça. En espérant que tu vas pouvoir comprendre quelque chose et que ça va être aussi utile pour d'autres personnes. C'est peut-être pas le code le plus élégant mais l'important, c'est que ça fonctionne, pour l'instant.
Mais avec ça, ça devrait rendre le code plus clair en permettant de séparer le code dans différent module et ainsi éviter de devoir tout mettre le code dans le même module
Dans ma form, j'ai seulement un label (LblEtatAvancement), une progress bar (ProgressBar1) et un bouton (cmdPartirThread)
Voici ce que ça donne :
1) il faudra donc définir l’objet de démarrage de la solution (right clic sur le projet/propriété; mettre l’objet de démarrage à Sub Main (préalablement définie)
2)
Module Global (Mod_Global.vb)<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>
Option
Explicit
On
Module
Mod_Global
'variable qui sert à setter le maximum du progress bar
Public
MaxValue AsDouble
Public
Sub
<?xml:namespace prefix st1 ns "urn:schemas-microsoft-com:office:smarttags" /??>
<st1:place w:st="on">Main</st1:place>()
'à chaque 1%, on montre la progression, ce qui est pas mal fluide
'pourquoi un intervalle de 1%, parce que l'invoke relentit pas mal la procédure,
'donc, le moins possible le invoke