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 mettre en pause ou arrêter une fonction "Sleep"


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mars 2011
    Messages : 20
    Points : 12
    Points
    12
    Par défaut Comment mettre en pause ou arrêter une fonction "Sleep"
    Bonjour,

    J'ai besoin dans un petit programme de faire des pauses en attendant que certains processus soient finis. J'ai regarder pas mal de forum et de tuto sur le sujet qui utilisent tous soit un timer soit un System.Threading.Thread.Sleep() mais qui ne me conviennent pas : durant l'attente, le programme ne réagit plus du tout. Finalement j'ai trouvé ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        Friend Sub hbwait(ByVal ms_to_wait As Long)
            Dim endwait As Double
            endwait = Environment.TickCount + ms_to_wait
            While Environment.TickCount < endwait
                System.Threading.Thread.Sleep(1)
                Application.DoEvents()
            End While
        End Sub
    en appelant la fonction hbwait, tout marche très bien. Mais à présent je voudrais pouvoir annuler ou mettre en pause cette fonction quand on appuie sur un bouton... et là je coince ! Il faut sans doute détecter l'évènement "j'appuie sur telle touche" et sortir de la boucle mais en terme de code, je ne vois pas du tout ce qu'il faut écrire (je débute)... Un p'tit coup de main (et de code) serait le bienvenu, merci d'avance

  2. #2
    Membre averti Avatar de Jerede
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2010
    Messages
    271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mai 2010
    Messages : 271
    Points : 422
    Points
    422
    Par défaut
    Bonjour,

    Tu peut utiliser le .WaitForExit(); de la classe Process

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 8
    Points : 6
    Points
    6
    Par défaut while imbriquer
    salut,

    Pourquoi pas mettre 2 while imbriquer avec une boolean ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Friend Sub hbwait(ByVal ms_to_wait As Long)
            Dim endwait As Double
            endwait = Environment.TickCount + ms_to_wait
    while stoptimer=false
            While Environment.TickCount < endwait
                System.Threading.Thread.Sleep(1)
                Application.DoEvents()
            End While
    end while
        End Sub
    Stoptimer devient vrai si tu appui sur le bouton dans la fonction button1_click par exemple, resultat l'ordi nexecute plus lotre fonction while et arrete de "sleeper"

  4. #4
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 493
    Points
    5 493
    Par défaut
    Bonjour.

    Avant toute choses, que veux-tu dire par "je veux mettre en pause" ? Veux-tu mettre en pause le processus ou l'arrêter ? Si tu veux l'arrêter, le code ci-dessus fera l'affaire. Si tu veux mettre en pause, c'est une autre histoire, c'est à ton processus que tu dois communiquer une information.

    Donc, si c'est bien un processus (une autre application windows), je t'invite à regarder MSDN : Interprocess communication. Un mutex devrait faire l'affaire pour toi.

    En revanche, si pas processus tu voulait dire "threads", là c'est autre chose, tu devrais te tourner vers les EventWaitHandle. Un petit exemple pour comprendre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    // THREAD A
    // AutoResetEvent est un descendant de EventWaitHandle. Initialement, il est "faux"
    var ew = new AutoResetEvent(false);
    while(true)
    {
      ...
      // Attend que quelqu'un ait défini l'événement à "vrai" ou jusqu'à ce que 100ms se soient écoulées (une seule des deux conditions est nécessaire pour que le thread reprenne)
      ew.Wait(100);
    }
     
    // THREAD B
    // On définit l'événement à "vrai", ce qui réveille l'autre thread.
    ew.Set();

    Au passage, ton code est mal fichu. L'idéal aurait été de créer un autre thread qui, lui, se chargerait de lancer ton processus (ou tes threads), d'attendre avec WaitForExit et de signaler à ton thread UI qu'il a fini.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mars 2011
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Merci pour toutes ces réponses, il va me falloir un peu de temps pour potasser tout ça.... il y a beaucoup de nouvelles choses pour moi.

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    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 177
    Points : 25 125
    Points
    25 125
    Par défaut
    un callback ?

  7. #7
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Points : 2 201
    Points
    2 201
    Par défaut
    On ne met jamais le thread principal (UI) en pause.

    Sauf le matin à 10h00.

Discussions similaires

  1. Comment mettre en Pause une Thread et la relancer?
    Par Hellik dans le forum VB.NET
    Réponses: 6
    Dernier message: 14/07/2009, 12h28
  2. VB5 Comment mettre en pause une boucle?
    Par geof dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 18/04/2008, 12h08
  3. Comment mettre en pause une application c#
    Par Contrec dans le forum C#
    Réponses: 2
    Dernier message: 17/09/2007, 10h42
  4. comment mettre du texte formaté dans une frame?
    Par afrikha dans le forum GTK+ avec C & C++
    Réponses: 5
    Dernier message: 09/10/2005, 14h55

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