Delegate, non asynchrone [Résolu]

OneHacker 1466 Messages postés jeudi 2 novembre 2000Date d'inscription 23 septembre 2007 Dernière intervention - 10 juin 2007 à 12:19 - Dernière réponse : OneHacker 1466 Messages postés jeudi 2 novembre 2000Date d'inscription 23 septembre 2007 Dernière intervention
- 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
Afficher la suite 

14 réponses

Répondre au sujet
TeBeCo 467 Messages postés lundi 24 juin 2002Date d'inscription 9 mars 2011 Dernière intervention - 14 juin 2007 à 13:32
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de TeBeCo
cs_niky 168 Messages postés jeudi 28 juin 2001Date d'inscription 18 octobre 2008 Dernière intervention - 11 juin 2007 à 00:08
0
Utile
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".
Commenter la réponse de cs_niky
OneHacker 1466 Messages postés jeudi 2 novembre 2000Date d'inscription 23 septembre 2007 Dernière intervention - 11 juin 2007 à 20:10
0
Utile
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
Commenter la réponse de OneHacker
OneHacker 1466 Messages postés jeudi 2 novembre 2000Date d'inscription 23 septembre 2007 Dernière intervention - 11 juin 2007 à 20:26
0
Utile
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
Commenter la réponse de OneHacker
cs_niky 168 Messages postés jeudi 28 juin 2001Date d'inscription 18 octobre 2008 Dernière intervention - 11 juin 2007 à 20:33
0
Utile
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
Commenter la réponse de cs_niky
cs_niky 168 Messages postés jeudi 28 juin 2001Date d'inscription 18 octobre 2008 Dernière intervention - 11 juin 2007 à 20:38
0
Utile
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
Commenter la réponse de cs_niky
OneHacker 1466 Messages postés jeudi 2 novembre 2000Date d'inscription 23 septembre 2007 Dernière intervention - 11 juin 2007 à 22:00
0
Utile
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
Commenter la réponse de OneHacker
TeBeCo 467 Messages postés lundi 24 juin 2002Date d'inscription 9 mars 2011 Dernière intervention - 11 juin 2007 à 22:18
0
Utile
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
Commenter la réponse de TeBeCo
OneHacker 1466 Messages postés jeudi 2 novembre 2000Date d'inscription 23 septembre 2007 Dernière intervention - 12 juin 2007 à 20:03
0
Utile
Et comment on instancie le délégué asyncallack ?

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

Redman
Commenter la réponse de OneHacker
TeBeCo 467 Messages postés lundi 24 juin 2002Date d'inscription 9 mars 2011 Dernière intervention - 15 juin 2007 à 19:16
0
Utile
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
Commenter la réponse de TeBeCo
OneHacker 1466 Messages postés jeudi 2 novembre 2000Date d'inscription 23 septembre 2007 Dernière intervention - 16 juin 2007 à 00:12
0
Utile
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
Commenter la réponse de OneHacker
TeBeCo 467 Messages postés lundi 24 juin 2002Date d'inscription 9 mars 2011 Dernière intervention - 16 juin 2007 à 00:19
0
Utile
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
Commenter la réponse de TeBeCo
OneHacker 1466 Messages postés jeudi 2 novembre 2000Date d'inscription 23 septembre 2007 Dernière intervention - 16 juin 2007 à 01:00
0
Utile
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
Commenter la réponse de OneHacker

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.