Delegate, non asynchrone

Résolu
OneHacker Messages postés 1447 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 23 septembre 2007 - 10 juin 2007 à 12:19
OneHacker Messages postés 1447 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 23 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.

Redman

14 réponses

TeBeCo Messages postés 467 Date d'inscription lundi 24 juin 2002 Statut Membre Dernière intervention 9 mars 2011
14 juin 2007 à 13:32
voici un des exemple d'utilisation (bon les appel et les signature correspondent a un besoin precis de leur code faudra changer ca en grande partie mais le reste est largement exploitable et conmprehensible a partir du moment ou tu fait l'effort de lire je pense que ca ira sans problème :
http://msdn.microsoft.com/library/fre/default.asp?url=/library/FRE/cpref/html/frlrfsystemiasyncresultclasstopic.asp

http://msdn.microsoft.com/library/fre/default.asp?url=/library/FRE/cpref/html/frlrfsystemwindowsformscontrolclassbegininvoketopic2.asp
http://msdn.microsoft.com/library/fre/default.asp?url=/library/FRE/cpref/html/frlrfsystemwindowsformscontrolclassbegininvoketopic1.asp

plus de la lecture sur les delegué
http://msdn.microsoft.com/library/fre/default.asp?url=/library/FRE/cpref/html/frlrfsystemdelegateclasstopic.asp

TeBeCo
3
cs_niky Messages postés 168 Date d'inscription jeudi 28 juin 2001 Statut Membre Dernière intervention 18 octobre 2008 7
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".
0
OneHacker Messages postés 1447 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 23 septembre 2007 2
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.

par contre c'est ByVal link as string.

Merci :D

Redman
0
OneHacker Messages postés 1447 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 23 septembre 2007 2
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_niky Messages postés 168 Date d'inscription jeudi 28 juin 2001 Statut Membre Dernière intervention 18 octobre 2008 7
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
0
cs_niky Messages postés 168 Date d'inscription jeudi 28 juin 2001 Statut Membre Dernière intervention 18 octobre 2008 7
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
0
OneHacker Messages postés 1447 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 23 septembre 2007 2
11 juin 2007 à 22:00
Ca j'avais remarqué mais je me demandé si il y a pas un moyen de trovuer un delegate compatible avec String. Enfin si c'est pas possible ben tant pis

Redman
0
TeBeCo Messages postés 467 Date d'inscription lundi 24 juin 2002 Statut Membre Derniè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
0
OneHacker Messages postés 1447 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 23 septembre 2007 2
12 juin 2007 à 20:03
Et comment on instancie le délégué asyncallack ?

Redman
0
OneHacker Messages postés 1447 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 23 septembre 2007 2
15 juin 2007 à 18:05
Merci beaucoup, cela m'a bien servi, je vais enfin pouvoir continuer mon projet ! Merci !

Redman
0
TeBeCo Messages postés 467 Date d'inscription lundi 24 juin 2002 Statut Membre Dernière intervention 9 mars 2011
15 juin 2007 à 19:16
ca corespond bien a ce que tu cherchais exactement ?
(si oui c'est un plaisir d'aider)
si non j'ai essayer de faire au mieux de ce que j'ai compris

(pti rappel : un chan IRC est ouvert pour résoudre les pb)

TeBeCo
0
OneHacker Messages postés 1447 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 23 septembre 2007 2
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 ?

Redman
0
TeBeCo Messages postés 467 Date d'inscription lundi 24 juin 2002 Statut Membre Derniè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 ^^)

TeBeCo
0
OneHacker Messages postés 1447 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 23 septembre 2007 2
16 juin 2007 à 01:00
J'ai modifié mon code en prenant l'exemple du lien http://msdn.microsoft.com/library/fre/default.asp?url=/library/FRE/cpref/html/frlrfsystemdelegateclasstopic.asp

Et ca ne marche toujours pas !

    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

Redman
0
Rejoignez-nous