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 :

Comment obtenir les données d'un thread [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 Comment obtenir les données d'un thread
    Bonsoir a tous,
    Je sollicite à nouveau le forum (je vais finir par me faire remarquer ).
    Donc voilà, j'ai une classe destinée a gérer l’exécution de Taches en manipulant indifféremment (ou presque) un certains nombre de Threads ou de Process selon la demande. C'est à l’intérieur de cette classe que je gère les statuts et les pourcentages d'avancement des taches de manière globale (tenant compte de tous les Threads et de tous les Process).
    Le problème se pose en ce qui concerne le retour des informations d'avancement provenant des Sub exécutées par les Threads.

    La difficulté tiens du fait que les Sub se trouvent en dehors de la classe et que j'aimerais éviter autant que possible de faire référence a des objets en dehors de celle-ci (mais ça me parait difficile de faire autrement ).

    J'ai imaginé plusieurs solutions comme ci-dessous mais j'aimerais beaucoup avoir votre avis avant de me lancer :
    1- Solution toute simple en déclarant autant de Variables Public 'InfoProgress' que de Sub, celles-ci servant de variable d’échange entre la Sub et la Classe (C'est pas très propre du point de vue POO je trouve).
    2- En utilisant les TLS (Threads Local Storage) qui se décline en 2 versions (les emplacements alloués 'Thread.AllocateDataSlot' ou les emplacements nommés 'Thread.AllocateNamedSlot'). L'instanciation des Threads se faisant dans la classe, cela me semble assez facile de lire les infos de chaque Threads.
    Faut t'il que j'utilise un Timer dans ma classe comme je l'imagine pour les solutions 1 ou 2 pour lire périodiquement les infos ?
    3- A l'aide d’événements levées a l’intérieur de chaque Sub ? (Mais dans ce cas cela me semble compliqué et pas très propre du point de vue POO.

    Après il y a peut-être d'autres solutions que je ne connais pas. Ça intéresserais beaucoup de savoir ce qui se fait couramment dans des cas comme celui là.

    Merci beaucoup pour votre aide.

  2. #2
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    Bonsoir,

    Moi j'utiliserais la solution 3 comme dans le BackGroundWorker. Je ne vois pas se qui est complexe de faire un RaiseEvent ProgressChanged(20) dans le code et de déclarer l’événement? Ni non plus en quoi se ne serait pas très propre niveau POO, c'est massivement utilisé dans le frameWork .net et c'est même un design pattern

  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
    Bonjour Sankasssss,
    D'habitude je déclare un événement dans une classe et je m'abonne autant de fois que je veux dans Form1, Form2....etc par exemple.
    Ici c'est l'inverse, les événements devront être levées un peu partout dans le code et c'est la classe qui devra s'abonner. Mais si je ne dit pas de bêtises dans ce cas la déclaration d’événement appartient à Form1 ou Form2... je vais donc devoir m'abonner a autant d’événement que de Form....
    Après j'ai peut-être fait une erreur de conception de mon modèle, je ne sais pas trop. Merci beaucoup de m’éclairer.

  4. #4
    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 omis une 4eme solution , je me demande pourquoi je n'y ai pas pensé plus tôt :
    J'ai juste ajouté une méthode SetProgress dans ma classe du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Public Class TasksManager
    Public Sub SetProgress (Byval Progress as Integer)
      Dim ThisThread As Threading.Thread = Threading.Thread.CurrentThread
    ....' Stockage de la valeur Progress de chaque Threads.
    End Sub
    End Class
    et dans les Sub du code principale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Private Sub DoTheTask
    Dim ThisTask as new TasksManager
    ThisTask.SetProgress (10)
    End Sub
    Ainsi chaque Sub peux appeler SetProgress puis dans cette méthode je récupére le Thread qui a lancé la Sub, ensuite je range la valeur Progress dans une SortedList (of Clé, Valeur) ou la clé=l'Id du Thread et Valeur=Progress.

    Je n'ai pas encore pu tester, j'espère que je ne vais pas avoir des exceptions a cause des accès aux SortedList a partir des différents Threads mais je le saurais bientôt.

    Ça ne réponds pas à mes interrogations par rapport a la proposition de Sankassss mais il est très possible que j'ai mal exposé mon problème.

    Merci beaucoup si vous avez d'autres avis ou suggestions.

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

Discussions similaires

  1. [Débutant] Tableau dans un GUI : comment obtenir les données?
    Par _TiPi_ dans le forum Interfaces Graphiques
    Réponses: 1
    Dernier message: 08/03/2015, 22h24
  2. Réponses: 6
    Dernier message: 26/04/2012, 07h42
  3. comment obtenir les données d'un dataform? +childwindow
    Par dhay06 dans le forum Silverlight
    Réponses: 8
    Dernier message: 04/06/2010, 12h20
  4. Réponses: 4
    Dernier message: 23/09/2008, 18h40
  5. Réponses: 6
    Dernier message: 31/03/2008, 11h10

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