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 :

Utiliser Threading.monitor (pause d'un thread)


Sujet :

VB.NET

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 19
    Par défaut Utiliser Threading.monitor (pause d'un thread)
    Bonjour à tous !

    Voila, j'aimerais savoir comment mettre un thread en pause.

    Tout ce passe bien quand j'utilise les fonctions ou mais apparement ces fonctions vont bientot etre obsoletes..

    J'ai pu lire sur un forum qu'il existait la classe qui permettait de "remplacer" les 2 autres solutions (ou du moins arriver au même résultat) mais je n'arrive pas à l'utiliser.

    Quelqu'un aurait-il des infos sur le sujet ou autre solution pour mettre en pause un thread?

    (C'est peut etre moi qui fait tout à l'envers aussi )

    Merci de votre aide

  2. #2
    Membre Expert Avatar de OhMonBato
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 660
    Par défaut
    Ce serait pas en VB.Net des fois ? (Là tu es sur le forum VB6 ou antérieur)

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 19
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monthread.suspend() ou monTHread.resume()
    C'est du VB.

    Après la classe threading.monitor c'est vrai que j'ai pas fait gaffe..

    En tout cas je code en VB, c'est peut etre pour ca que ca marche pas aussi

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 19
    Par défaut
    Après vérif, c'est bien du VB

  5. #5
    Membre Expert Avatar de OhMonBato
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 660
    Par défaut
    Du VB oui, mais quelle version ?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 19
    Par défaut
    En fait je crois que je ne sais pas utiliser les thread c'est tout..

    Je vous expose ce que je suis en train de faire: je copie un gros répertoire et j'aimerais faire 3 boutons (copy, pause, resume). Mon interface est bonne, ma copie fonctionne (J'utilise un "BackgroundWorker" pour la copie).

    Dans ce "backgroundworker" je crée un thread (threadCopy) qui lance ma fonction copy().

    Est-ce que ma copie se lance bien sur un thread séparé en faisant ça?

    Parce que quand j'utilise monThread.suspend ou abort ou quoi que ce soit la copie n'arrête pas..

    Je n'ai peut être pas accès a mon thread du fait qu'il soit en backgroundWorker ?

  7. #7
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2011
    Messages
    453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 453
    Par défaut
    Il faut utiliser l'évènement progressChanged du BackGroundWorker pour savoir où en est ton thread d'arrière plan.

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    tout d'abord vb6 et vb.net sont 2 choses totalement différentes, basées sur le langage basic (tu fais bien du vb.net)


    ton code dans le thread est il une boucle ou quelque chose sur lequel tu n'as aucun moyen de gestion ?

    si c'est une boucle, il y a plein de méthode comme le manualresetevent
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 19
    Par défaut
    Je vais vous montrez le bout de mon code vous comprendrez peut être mieux

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    Dim threadCopy As Thread
     
     ''''''''  Bouton COPIER  '''''''
    Private Sub BTN_Copy_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTN_Copy.Click
    BackgroundWorker1.RunWorkerAsync
    End sub
     
        ''''''''  BACKGROUNDWORKER  '''''''
    Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
           threadCopy = New System.Threading.Thread(AddressOf copy)
           threadCopy.Start()
    End Sub
     
        ''''''''  Bouton PAUSE  '''''''
        Private Sub BTN_Pause_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTN_Pause.Click
            threadCopy.Suspend()
        End Sub
     
        ''''''''  Bouton RESUME  '''''''
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTN_Resume.Click
            threadCopy.Resume()
    End Sub
     
    Sub copy()
            Dim fso
            fso = CreateObject("Scripting.FileSystemObject")
            If Not fso.FolderExists("C:\VisDMU2") Then
                fso.createFolder("C:\VisDMU2")
            End If
            fso.copyFolder("C:\VisDMU", "C:\VisDMU2")
            fso = Nothing
     
    End Sub
    Voilà, j'espere que ca vous parlera un peu mieu et merci de votre aide car la je bloque.

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    si tout se passe bien avec suspend et resume, continue des les utiliser
    même marqué obsolete une méthode ne disparait pas d'une version du framework ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  11. #11
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 194
    Par défaut

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    certes msdn dit que ces méthodes sont pas terribles, mais si tu veux éviter toi même de coder la copie de tous les fichiers par récursivité je ne vois pas trop comment tu pourrais faire (en codant toi même tu pourrais utiliser un simple manualresetevent pour faire pause)
    la ligne de code que tu utilises appelle surement une api de windows, donc tu ne peux pas avoir la main dessus, c'est déjà bien que .suspend fonctionne dessus je pense
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 19
    Par défaut
    Le problème c'est que j'ai eu l'impression que ces méthodes fonctionnaient mais en fait suspend() et résume() ne marche pas .

    Je les utilise bien pourtant ? Il n'y a pas d'import à faire ou quelque chose d'autre comme ca ?

    Je pense que je vais devoir copier par récursivité comme tu dis, ce sera plus simple à gérer..

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 19
    Par défaut
    Une petite question au passage, pour les BackgroundWorker, Existe t-il une possibilité pour les mettre en pause ?
    Ou peut être sauvegardé un état, le stopper et le relancer en lui précisant l'état dans lequel il se trouvait ?

    Merci en tout cas de vos réponse

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    Citation Envoyé par pISQUIK Voir le message
    Le problème c'est que j'ai eu l'impression que ces méthodes fonctionnaient mais en fait suspend() et résume() ne marche pas .

    Je les utilise bien pourtant ? Il n'y a pas d'import à faire ou quelque chose d'autre comme ca ?

    Je pense que je vais devoir copier par récursivité comme tu dis, ce sera plus simple à gérer..

    ca m'étonnait aussi que ca fonctionne
    comme je l'ai dit, la méthode que tu utilises fait un appel d'api (dll de windows), et donc ca sort de ton programme et tu n'as plus de pouvoir dessus (juste un callback géré par le framework qui bloque à ta ligne de code je pense)

    Citation Envoyé par pISQUIK Voir le message
    Une petite question au passage, pour les BackgroundWorker, Existe t-il une possibilité pour les mettre en pause ?
    Ou peut être sauvegardé un état, le stopper et le relancer en lui précisant l'état dans lequel il se trouvait ?

    Merci en tout cas de vos réponse
    c'est à toi de gérer la pause
    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
    25
     
    private _manualresetevent as new manualresetevent
     
    private sub démarragbgw
     
      copyrecur(params)
     
    end sub
     
    private _pause as boolean
     
    private sub buttonpause_click (...) handles ...
       if _pause = true then
          _manualresetevent.set
       end if 
       _pause = not _pause
    end sub
     
    private sub copyrecur(params)
       for each file and folders
         if _pause then  _manualresetevent.waitone
         copy
         copyrecurparams(params)
       next
    end sub

    ca doit être à peu près ca, .waitone attend que .set soit appelé pour repartir
    regarde si tu as le manualreseteventslim (dispo depuis le framework 3.5 ou 4 je crois), il me semble qu'il a un booléen d'état qui permettrait de ne pas en créer un
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  16. #16
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Pol63 a donné la bonne réponse : il faut passer par des WaitHandle, par exemple un ManualResetEvent. On peut ainsi obtenir le même comportement qu'avec Thread.Suspend/Resume.

Discussions similaires

  1. Utilisation d'un quadCore grace au threads?
    Par babarpapa dans le forum Concurrence et multi-thread
    Réponses: 7
    Dernier message: 18/09/2007, 16h22
  2. Realisation d'une pause avec les thread
    Par toitoine01 dans le forum Concurrence et multi-thread
    Réponses: 9
    Dernier message: 10/05/2006, 08h51
  3. [Threads] Monitorer l'activité de threads
    Par guipom dans le forum Concurrence et multi-thread
    Réponses: 2
    Dernier message: 06/01/2006, 10h01
  4. [MFC] Faire une pause dans un thread
    Par Kevgeii dans le forum MFC
    Réponses: 3
    Dernier message: 21/02/2005, 11h49
  5. impossible d'utiliser un HWND parent dans un thread
    Par sylvain114d dans le forum Windows
    Réponses: 12
    Dernier message: 23/09/2004, 12h21

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