OneHacker
Messages postés1447Date d'inscriptionjeudi 2 novembre 2000StatutMembreDernière intervention23 septembre 2007
-
10 juin 2007 à 12:19
OneHacker
Messages postés1447Date d'inscriptionjeudi 2 novembre 2000StatutMembreDernière intervention23 septembre 2007
-
16 juin 2007 à 01:00
Bonjour, alors j'appelle une procédure de façon asynhrone come on me l'a expliqué mais ca ne marche pas :
Delegate Sub LoadLink(ByVal link As String)
Sub LoadlinkHandler(ByVal link As String)
Diagnostics.Process.Start(link)
End Sub
Private Sub llDoc_LinkClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles llDoc.LinkClicked
Dim llh As New LoadLink(AddressOf LoadlinkHandler)
Me.Invoke(llh, "http://developer.mozilla.org/fr/docs/Construire_une_extension")
llDoc.LinkVisited = True
End Sub
Au moment ou j'invoke le délégué l'opération reste synchrone je ne sais pas comment arranger ça.
cs_niky
Messages postés168Date d'inscriptionjeudi 28 juin 2001StatutMembreDernière intervention18 octobre 20087 11 juin 2007 à 00:08
Salut,
Si LoadLink est exécuté avant l'instruction llDoc.LinkVisited c'est parce que tu utilises Invoke dans un contexte particulier.
Normalement, la méthode Invoke permet d'intéragir avec les contrôles utilisateurs (boutons, barres de progression, etc.) à l'intérieur d'un thread. Cela a pour but que la méthode appelée par Invoke s'exécute dans le thread principal de l'application (parce que les Windows Forms ne fonctionnent pas correctement lors d'appels inter-threads)... Bref.
Ici, lorsque l'événement LinkClicked se produit, son code s'exécute dans le thread principal de l'application. Lorsque tu fais appel à Invoke, celui-ci se poser la question "Est-ce que je suis dans le thread principale de l'application ?". Si oui, la méthode à invoquer est appelée. Si non, la méthode est mise en file d'attente jursqu'à ce que le thread principal ait la main.
Là, on est dans le premier cas : donc l'appel est synchrone.
Pour réaliser un appel asynchrone, il faut créer un thread :
Private Sub llDoc_LinkClicked(ByVal sender As System.Object, ByVal e As
System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles
llDoc.LinkClicked
Dim llh As New LoadLink(AddressOf LoadlinkHandler)
Dim mythread As New System.Threading.Thread(New System.Threading.ParameterizedThreadStart(LoadLink_Thread))
mythread.Start("http://developer.mozilla.org/fr/docs/Construire_une_extension");
llDoc.LinkVisited = True
End Sub
Sub LoadLink_Thread(ByVal link As object)
Diagnostics.Process.Start(link.ToString())
End Sub
Pour info : les délégués ne permettent pas d'appeler une méthode de manière asynchrone. Il s'agit juste d'une version managé de ce qu'on appelle plus généralement "pointeurs de fonctions".
OneHacker
Messages postés1447Date d'inscriptionjeudi 2 novembre 2000StatutMembreDernière intervention23 septembre 20072 11 juin 2007 à 20:10
Ah d'accord, mais c'est drole comment avant j'appelé un thread mais comme j'avais rencontré un problème avec le BackGroundWorker, on m'avait conseillé d'utiliser un délégate mais en fait suffit de faire un thread quoi.
OneHacker
Messages postés1447Date d'inscriptionjeudi 2 novembre 2000StatutMembreDernière intervention23 septembre 20072 11 juin 2007 à 20:26
Désolé si on peut pas éditer les messages mais il y a un problème. j'ai remplacé ByVal link As Object par ByVal link As String car c'est un lien(texte) mais je vois pas comment utiliser le délégate avec le thread de manière à ce que la signature soit ByVal link As String
Et apparemment le llh ne sert plus à rien si j'ai bien compris.
Redman
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_niky
Messages postés168Date d'inscriptionjeudi 28 juin 2001StatutMembreDernière intervention18 octobre 20087 11 juin 2007 à 20:33
Je crois me souvenir que le BackgroundWorker se contente d'encapsuler un thread pour en faire un objet un peu plus agréable à utiliser.
Le fait que link soit de type Object vient du fait du prototype attendu par le constructeur de ParameterizedThreadStart. Je ne suis pas convaincu qu'en mettant un type String cela fonctionne... à tester
Hum... et le llh ne sert effectivement plus à rien. Ca m'apprendra à faire du copier/coller
cs_niky
Messages postés168Date d'inscriptionjeudi 28 juin 2001StatutMembreDernière intervention18 octobre 20087 11 juin 2007 à 20:38
Donc apparemment tu es obligé d'utiliser le prototype Sub LoadLink_Thread(ByVal link As object)... ce qui est logique finalement
Pour récupérer une chaîne, soit tu utilises le ToString comme je l'ai fait. Sinon, comme tu sais que link est de type string, tu peux directement le caster :
Sub LoadLink_Thread(ByVal link As object)
Dim strLink As String = CType(link, String)
Diagnostics.Process.Start(strLink)
End Sub
TeBeCo
Messages postés467Date d'inscriptionlundi 24 juin 2002StatutMembreDernière intervention 9 mars 2011 11 juin 2007 à 22:18
utilise : BeginInvoke + EndInvoke via des procédure de callback, les procédure comment par "Begin" avec en correspondance la meme commencant par "End" sont les procédure d'appel asynchrone
au lieu d'écrire Me.Invoke tu utilise le .BeginInvoke du delegate en question pour l'asynchrone et pour al modification de controle sur le form lui meme (pb d'operation interthread) faudra utilisé un Invoke ou un invokerequired pour reglé ca
n'ayant pas le code sous la main comme ca j'en ai pas mit :s
OneHacker
Messages postés1447Date d'inscriptionjeudi 2 novembre 2000StatutMembreDernière intervention23 septembre 20072 16 juin 2007 à 00:12
Oui c'était exactement ça, merci beaucoup. Dommage que la procédure BeginInvoke() seule n'est pas aussi simple que la procédure BeginInvoke() d'un contrôle mais je vais m'en sortir.
Merci !
P.S :"pti rappel : un chan IRC est ouvert pour résoudre les pb" ah oui ? Cool où ça ?
TeBeCo
Messages postés467Date d'inscriptionlundi 24 juin 2002StatutMembreDernière intervention 9 mars 2011 16 juin 2007 à 00:19
reseaux Heliosnet chan #programmation ==> irc1.heliosnet.org, irc2.heliosnet.org irc3... (c'est les 3 seuls pour le moment)
il s'agit du chan Officiel de Codes-Sources voué uniqument a la programmation (pensez a lire les regle attentivement pour eviter les possible surprises ^^)
Private Sub llDoc_LinkClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles llDoc.LinkClicked
Dim llh As New LoadLink(AddressOf LoadlinkHandler)
llh("http://developer.mozilla.org/fr/docs/Construire_une_extension")
llDoc.LinkVisited = True
End Sub