IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Assigner le travail d'un BackgroundWorker dynamiquement dans une classe. [Débutant]


Sujet :

VB.NET

  1. #1
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut Assigner le travail d'un BackgroundWorker dynamiquement dans une classe.
    Bonjour a tous,
    Dans mon précédent Post je souhaitais réaliser une classe de TraitementVideo, je me rends compte que la gestion des objets Process ne suffit pas, je dois étendre les possibilités pour pouvoir exécuter du code a l'aide de BackGroundWorker(s).
    Ma classe va donc devenir un véritable gestionnaire de taches qui va devoir mêler l’exécution des Objets Process et des BackGroundWorkers.
    Bien que celle-ci fonctionnera principalement de façon synchrone (exécution des taches les unes a la suite des autres) je me donne la possibilité de pouvoir aussi les exécuter de façon asynchrone a l'aide d'une variable boolean "SyncMode" qui définira le mode d’exécution de chaque tache.
    Pour le cas qui m'interesse ici (les BackGroundWorker) je ne sais pas trop comment associer ce (ou ces) BackGroundWorker aux procédures SubTraitement1 ,2 ou 3 sans entraîner un forte dépendance (en faisant référence aux procédures) entre mon code principale et ma classe :

    Pour informations je pense que je vais instancier un ou plusieurs BackgroundWorker en fonction des taches a exécuter et qui se partagent la même procédure DoWork comme dans l'exemple suivant (Je ne vois pas comment c'est possible autrement). Ceux-ci se trouvant dans ma classe et les procédures Traitement1, 2 et 3 se trouvant dans mon code principale.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim Task as string = "Traitement1"
    Private Sub Bgw_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs)
    If Task = "Traitement1" then
    Call SubTraitement1
    ElseIf Task = "Traitement2" then
    Call SubTraitement2
    ....
    End If
    End Sub

    Cela n'a peut-être rien avoir mais j'ai pensé aux délégués (que je n'ai encore jamais utilisés), pensez vous que cela peut être une solution a mon problème et comment cela s’implémente ?

    Merci beaucoup pour votre aide.

  2. #2
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2010
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mai 2010
    Messages : 132
    Points : 166
    Points
    166
    Par défaut
    Tu n'as besoin de délégués que si les subs Traitment1() et Traitement2() modifient des objets partagés entre les threads (background workers) et l'interface utilisateur (forms).

    le background worker est un "Thread déguisé" avec un "délégué déguisé" ReportProgress qui te permet de passer des information au form en ecoutant les événements ProgressChanged du background worker.

    S'il te faut plus de control, il va falloir creer tes propres Threads, avec des délégués etc.

  3. #3
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    Merci de m'avoir répondu Zebrette.
    En fait je crois que j'ai mal posé ma question
    Si je prends le problème a l'envers je cherche un moyen de passer un paramètre a ma classe qui indiquera à celle-ci quelle procédure elle doit exécuter sans que je fasse référence a cette procédure explicitement a l'intérieur de ma classe puisque celle-ci ne doit pas connaitre a l'avance quelle procédure elle devra exécuter.

    Du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MaClasse.AddTask (MaProcédure, Paramétres)
    MaClasse.Start
    Un autre problème lié a cela est que je ne sais pas ranger les paramètres a l’intérieur de ma classe puisque ils sont tous d'un type différent.

  4. #4
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2010
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mai 2010
    Messages : 132
    Points : 166
    Points
    166
    Par défaut
    Si tu veux absolument utiliser un parametre String pour le nom de la sub a executer, il faudra utiliser System.Reflection pour retrouver la sub via son nom depuis ta class l'executer.

  5. #5
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 156
    Points : 25 075
    Points
    25 075
    Par défaut
    @BasicZX81
    C'est dommage, on voit que tu te poses des questions qui pourraient te mener à du code de bon niveau (ce n'est pas déjà pas le cas de tout le monde), mais il te manque l'assise technique pour y arriver

    pour la méthode variable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public sub new (mth as action)
    pour les paramètres c'est difficile de te donner la bonne solution, il y en a plusieurs qui pourraient convenir ...

    mais tout ca ne permet de répondre qu'à tes questions, tu manques de visibilité sur la globalité du code (à cause d'un manque d'expérience je pense) qui te permettrait d'utiliser encore quelque chose de plus large et plus simple (interface, polymorphisme etc...)

    peut etre que le backgroundworker n'est pas ce qu'il te faut non plus, un thread ou le threadpool pourrait peut etre convenir, après ca oblige à invoker soit même
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    Merci Pol63 et zebrette,
    C'est dommage, on voit que tu te poses des questions qui pourraient te mener à du code de bon niveau
    En effet, j'essaye de faire du bon code en fonction de mes connaissances et si cela me parait valoir le coup pour certaines partie du code.
    C'est souvent une affaire de compromis.
    Je n'ai que 2 à 3 heures par jour pour programmer et il n'y a que le week-end qui me permet de faire du code un peu plus sereinement. C'est très peu mais j'arrive a m'en sortir malgré tout.
    J’apprécie vraiment la qualité de ce forum ou les gens apportent des réponses très pertinentes pour la plupart, je me sens vraiment aidé.

    (interface, polymorphisme etc...)
    En plus du tuto de P. Lasserre proposé sur le site j'ai lu 2 ou 3 bouquins de 1000 pages, j'ai des notions mais pas encore assez de pratique pour avoir le recul suffisant pour savoir quel méthode a mettre en oeuvre.

    Merci pour la variable 'action' que je découvre, je vais regarder ça de plus prêt. La réflection proposé par zebrette peut peut-être aussi m'aider bien que je préfère l'utiliser avec parcimonie.

    J'utilise les BackgroundWorker par facilité mais je vais quand même jeter un œil sur les Threads, il me semble que j'ai croiser quelque part que l'on pouvait démarrer un thread a lui passant des paramètres. Encore une fois il se peut que je fasse des amalgames et que cela n'a rien a voir mais c'est peut-être aussi un début ou une partie de la solution.

    Pour les paramètres j'ai pensé au ArrayList tout simplement qui permettre de stocker tout et n'importe quoi. Je pourrais stocker cette ArrayList dans une liste avec (Clé,Valeur) pour pouvoir la retrouver facilement. Je cogite dur en ce moment et je ne suis pas sûre d'y arriver . Je reviendrais a quelques chose de plus simple si c'est la cas.

    Merci beaucoup.

  7. #7
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Bonjour
    Citation Envoyé par BasicZX81 Voir le message
    Si je prends le problème a l'envers je cherche un moyen de passer un paramètre a ma classe qui indiquera à celle-ci quelle procédure elle doit exécuter sans que je fasse référence a cette procédure explicitement a l'intérieur de ma classe puisque celle-ci ne doit pas connaitre a l'avance quelle procédure elle devra exécuter.

    Du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MaClasse.AddTask (MaProcédure, Paramétres)
    MaClasse.Start
    Une première approche simple avec action (a plusieurs surcharge) (param non vu)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Class ExecuteMethodeExterne
     
        Private UneMethode As Action
        ' liste des méthodes qui seront disponibles (identifiant, méthode)
        Private DicoMethode As Dictionary(Of String, Action) = New Dictionary(Of String, Action)
     
        Sub AjouteMethode(NomMethode As String, Methode As Action)
            DicoMethode.Add(NomMethode, Methode) ' ajoute une méthode et son identifiant
        End Sub
     
        ' execute la méthode en la retrouvant par son identifiant
        Sub Start(NomMethode As String)
            UneMethode = DicoMethode(NomMethode) 'appel direct impossible, il faut affecter 
            UneMethode()
        End Sub
     
    End Class
    Utilisation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
        Private eme As ExecuteMethodeExterne = New ExecuteMethodeExterne
     
        Private Sub frmCode_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            eme.AjouteMethode("trait1", AddressOf traitement1)
            eme.AjouteMethode("trait2", AddressOf traitement2)
        End Sub
        Private Sub btnTraitement1_Click(sender As System.Object, e As System.EventArgs) Handles btnTraitement1.Click
            eme.Start("trait1")
        End Sub
        Private Sub btnTraitement2_Click(sender As System.Object, e As System.EventArgs) Handles btnTraitement2.Click
            eme.Start("trait2")
        End Sub
        Sub traitement1()
            MessageBox.Show("Hello ; Traitement N°1")
        End Sub
        Sub traitement2()
            MessageBox.Show("Traitement N°2")
        End Sub
    __________________________________

    Citation Envoyé par BasicZX81 Voir le message
    Un autre problème lié a cela est que je ne sais pas ranger les paramètres a l’intérieur de ma classe puisque ils sont tous d'un type différent.
    Avec une autre approche sans stocker les différentes méthodes mais en les appelant à la volée, pour être le plus souple possible.
    Une méthode de la form
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Sub traitement5(Mess As String, mess2 As String)
            MessageBox.Show(Mess & mess2)
        End Sub
    Dans notre classe, nous définissons l'objet concerné pour l'invoque, nous recherchons la form et la méthode, et nous passons les paramètres
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Class ExecuteMethodeExterne
     
        Sub ExecuteMethodeObjParam(NomForm As String, NomMethode As String, oParam As Object)
            Dim f As Object = Type.GetType(System.Reflection.Assembly.GetExecutingAssembly.GetName.Name & "." & NomForm).GetConstructor(Type.EmptyTypes).Invoke(New Object() {})
            Type.GetType(System.Reflection.Assembly.GetExecutingAssembly.GetName.Name & "." & NomForm).GetMethod(NomMethode).Invoke(f, oParam)
        End Sub
    Appel depuis la form (avec une instance de la classe "ExecuteMethodeExterne" defini ainsi dans la form Private eme As ExecuteMethodeExterne = New ExecuteMethodeExterne)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            eme.ExecuteMethodeObjParam(Me.Name, "traitement5", New Object() {"N°5", " 2 param"})
    et avec la même méthode de la classe nous pouvons appeler d'autres méthodes de la form qui ont un nombre quelconque de paramètres et qui plus est de types différents (le nombre de paramètre passé devront bien sur correspondre au nombre de param attendu en entrèe et au type)
    Une autre méthode de la form
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Sub traitement6(Mess As String, mess2 As String, x As Integer)
            MessageBox.Show(Mess & mess2 & x.ToString)
        End Sub
    appel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            eme.ExecuteMethodeObjParam(Me.Name, "traitement6", New Object() {"N°6 ", " Nb param : ", 3}) ' param de type différent
    Note : la form et la classe doit être dans le même assembly (cela peut avoir de l'importance, je bute sur la recherche de la form si elle est dans un assembly différent de la classe)

    Espérant que cela t'apporte quelques idées ou un complément d'info.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  8. #8
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    Merci rv26t, je retiens la solution avec l'utilisation de la réflexion. C'est la seule méthode a priori qui me permet de passer des paramètres sans connaitre le nombres et le type de ceux-ci.

    Je suis agréablement surpris par la puissance de cette méthode.

    Pour être complet et après avoir investigué du coté du passage de paramètres dans les Threads, on peut bien passer un paramètre a un Thread mais celui-ci doit obligatoirement être du type Objet (comme ci-dessous).
    Dommage je trouvais cette solution plutôt pas mal mais je ne peut pas l'utiliser du fait que les paramètres de mes procédures sont imposés :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim Deleg As Threading.ParameterizedThreadStart = New Threading.ParameterizedThreadStart(AddressOf Affiche)
    Dim MonThread as Thread = New Thread(Deleg)
    MonThread.Start("Message")
     
    Private Sub Affiche(ByVal o As Object)
           MessageBox.Show(o.ToString)
    End Sub
    Merci beaucoup a vous tous

  9. #9
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 156
    Points : 25 075
    Points
    25 075
    Par défaut
    Citation Envoyé par BasicZX81 Voir le message
    on peut bien passer un paramètre a un Thread mais celui-ci doit obligatoirement être du type Objet (comme ci-dessous).
    Dommage je trouvais cette solution plutôt pas mal mais je ne peut pas l'utiliser du fait que les paramètres de mes procédures sont imposés
    dommage oui et non ^^
    object peut contenir tout par définition, y compris un tableau d'objet
    de plus au début du thread tu peux aller lire autre chose, tu n'es pas forcément obligé de te contenter de ce qui arrive en paramètre
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  10. #10
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Avec une expression lambda une méthode anonyme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        Private Sub btnThread_Click(sender As System.Object, e As System.EventArgs) Handles btnThread.Click
            Dim tmsg As Threading.Thread = New Threading.Thread(Sub() Affiche3("N°3 ", " Nb param : ", 3))
            tmsg.Start()
        End Sub
     
        Private Sub Affiche3(Mess As String, mess2 As String, x As Integer)
            MessageBox.Show(Mess & mess2 & x.ToString)
        End Sub
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  11. #11
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    Bonsoir, j'ai résolu un peu vite.
    Vous allez peut-être trouver que c'est une aberration mais j'ai imaginé que je pouvais combiner le passage de paramètres dans un Thread et la méthode Invoke. En revanche ça ne fonctionne pas, ça bloque sur la ligne Invoke avec ce message d'erreur :

    'System.Reflection.TargetParameterCountException'
    Je pense que je ne sais pas utiliser la méthode Invoke ou alors ma technique est voué a l’échec. Si quelqu'un a un avis sur la question ça m'interresse beaucoup.

    Voici la classe TaskThread qui sert a stocker les délégués et paramètres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Public Class TaskThread
        Private _Delegue As [Delegate]
        Private _Params As ArrayList
        Public Sub New(ByVal Delegue As [Delegate], ByVal Params As ArrayList)
            Me._Delegue = Delegue
            Me._Params = Params
        End Sub
        Public ReadOnly Property Delegue() As [Delegate]
            Get
                Return _Delegue
            End Get
        End Property
        Public ReadOnly Property Params() As ArrayList
            Get
                Return _Params
            End Get
        End Property
    End Class
    et voici le code du programme principale (encore en travaux), certaines lignes feront parties intégrante de la classe quand j'aurais terminé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    Delegate Sub DelegAffiche(ByVal Message As String, ByVal Num As Integer)
     
    Dim List As New ArrayList 
    List.Add("Message")
    List.Add(10)
     
    Dim DelegSub As DelegAffiche = New DelegAffiche(AddressOf Affiche)
    Dim ParamList As New TaskThread(DelegSub, List)
     
    Dim DelegStarter As Threading.ParameterizedThreadStart = New Threading.ParameterizedThreadStart(AddressOf Starter)
    Dim MonThread As Threading.Thread = New Threading.Thread(DelegStarter)
    MonThread.Start(ParamList)
     
    Private Sub Starter(ByVal o As Object)
            Dim ParamList As TaskThread = CType(o, TaskThread)
            Dim Deleg As [Delegate] = ParamList.Delegue
            Dim OParam As Object = ParamList.Params
            Me.Invoke(Deleg, OParam)
    End Sub
     
    Private Sub Affiche(ByVal Arg1 As String, ByVal Arg2 As Integer)
            MessageBox.Show(Arg1 & Arg2.ToString)
    End Sub
    EDIT : J'avais loupé vos messages précédent, merci beaucoup je regarde ça.

  12. #12
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 156
    Points : 25 075
    Points
    25 075
    Par défaut
    Citation Envoyé par rv26t Voir le message
    Avec une expression lambda
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        Private Sub btnThread_Click(sender As System.Object, e As System.EventArgs) Handles btnThread.Click
            Dim tmsg As Threading.Thread = New Threading.Thread(Sub() Affiche3("N°3 ", " Nb param : ", 3))
            tmsg.Start()
        End Sub
     
        Private Sub Affiche3(Mess As String, mess2 As String, x As Integer)
            MessageBox.Show(Mess & mess2 & x.ToString)
        End Sub
    C'est encore ce qu'il y a de mieux, mais à priori ca s'appelle une méthode anonyme, les expressions lambda c'est autre chose même si souvent il y a confusion
    (System.Linq.Expressions.LambdaExpression, pas simple à utiliser, pas très utile avant le framework 4, pas souvent nécessaire, mais bien puissant aussi)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  13. #13
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    C'est encore ce qu'il y a de mieux, mais à priori ca s'appelle une méthode anonyme, les expressions lambda c'est autre chose même si souvent il y a confusion
    (System.Linq.Expressions.LambdaExpression, pas simple à utiliser, pas très utile avant le framework 4, pas souvent nécessaire, mais bien puissant aussi)
    Je corrige mon erreur, merci Pol63
    pour info Méthodes anonymes (en C# désolé)
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  14. #14
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    Merci encore à vous,
    J'aurais juste besoin d'une dernière information. A priori on s'approche de la solution mais je n'arrive pas à aller au bout.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      Private Sub btnThread_Click(sender As System.Object, e As System.EventArgs) Handles btnThread.Click
            Dim tmsg As Threading.Thread = New Threading.Thread(Sub() Affiche3("N°3 ", " Nb param : ", 3))
            tmsg.Start()
        End Sub
    Dans cet exemple 'Affiche3' et les paramètres associés sont codés en dure, je voudrais pouvoir passer des paramètres a la fois pour la procédure appelée et les paramètres (un peu sur le principe que j'avais commencé a faire dans mon Post précèdent).

    Si ça fonctionne la seule déclaration en dure que j'ai besoin de faire se trouve dans le code principale, donc ça ne me gène pas puisque je n'ai pas besoin de toucher a la classe si je veux ajouter une nouvelle procédure par la suite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Delegate Sub DelegAffiche(ByVal Message As String, ByVal Num As Integer)
    Je vous remercie beaucoup si vous pouvez m'aider compléter ce principe si c'est possible.

    EDIT : je précise que dans mon exemple précédent, les lignes de code concernant l'instanciation et le démarrage du Thread se fera dans la classe. (Je n'ai pas eu le temps de terminer).

  15. #15
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    Bonsoir,
    Cette fois mon problème est belle et bien résolu, j'ai remplacé les ArrayList par des Object et corrigé notamment ces lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim OParam As Object() = CType(ParamList.Params, Object())
    Deleg.DynamicInvoke(OParam)
    Je vais enfin pouvoir passer à la suite de mon code.
    Je remercie tous ceux qui mon aidé.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 25/03/2011, 14h04
  2. Attributs dynamiques dans une classe
    Par ratapapa dans le forum Langage
    Réponses: 2
    Dernier message: 16/12/2009, 17h16
  3. variable dynamique dans une fonction javascript
    Par Shivaneth dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/04/2005, 15h58
  4. [jsp] include dynamique dans une jsp
    Par petitelulu dans le forum Servlets/JSP
    Réponses: 9
    Dernier message: 04/03/2005, 07h59
  5. Réponses: 6
    Dernier message: 24/09/2004, 13h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo