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 :

Problême avec fonction Sleep


Sujet :

VB.NET

  1. #1
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 204
    Par défaut Problême avec fonction Sleep
    Bonsoir à tous !

    J'aimerais réaliser des pauses pendant un affichage de splashscreen, j'utilise donc la fonction Sleep comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    System.Threading.Thread.Sleep(1000)
            Label_Chargement.Text = "Recherche clé dongle ..."
            System.Threading.Thread.Sleep(2000)
            Label_Chargement.Text = "Lancement ..."
    Le souci est que lorsque je lance le debug, je ressent les pauses car le form ne s'affiche pas et après quelques secondes j'ai mon form avec d'affiché dans Label_Chargement : "Lancement ..." . En gros, il fais les pauses avant et après il m'ouvre le form avec la dernière commande ...

    Avez-vous eu ce soucis ? Ou est-ce que je procède mal ?

    Merci de votre aide s'il vous plait !

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 193
    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 193
    Par défaut
    le thread principal sert à l'affichage, quand celui ci est surchargé de travail ou est en pause, l'interface ne se rafraichit pas et windows affiche "Ne répond pas"

    pour les traitement long (> 1 seconde) il faut alors les mettre dans un thread séparé
    pour les pauses comme tu veux faire il faut procéder autrement (un timer et une variable d'étape par exemple)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 204
    Par défaut
    J'ai essayé dans un timer, même résultat

  4. #4
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 204
    Par défaut
    Alors j'ai essayé avec un Thread, ca a l'air de marché mais il renvoi une erreur celle ci :

    Opération inter-threads non valide : le contrôle 'Label_Chargement' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé.
    sur cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Label_Chargement.Text = "Recherche clé dongle ..."
    Je ne peux pas utiliser mon Label ? :s

  5. #5
    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 : 42
    Localisation : Belgique

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Par défaut
    Regarde ce post tu auras ta réponse

  6. #6
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    C'est pas vraiment la solution la plus propre, mais tu peux essayer Application.DoEvents() avant le Sleep().

  7. #7
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 204
    Par défaut
    J'ai essayé ceci :

    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
        Private Thread_Boot As Thread
     
        Private Sub ThrFunc1()
            If Label_Chargement.InvokeRequired Then
                Label_Chargement.Invoke(AddressOf FonctionLabelChange)
            Else
                FonctionLabelChange()
            End If
     
        End Sub
     
        Private Sub FonctionLabelChange()
            System.Threading.Thread.Sleep(1000)
            Label_Chargement.Text = "Recherche clé dongle ..."
            System.Threading.Thread.Sleep(2000)
            Label_Chargement.Text = "Lancement ..."
            System.Threading.Thread.Sleep(1000)
            Form1.Show()
        End Sub
     
        Private Sub StartThread()
            Thread_Boot = New Thread(AddressOf ThrFunc1) 'ThrFunc est la fonction exécutée par le thread.
            Thread_Boot.Name = "Thread1" 'Il est parfois pratique de nommer les threads surtout si on en créé plusieurs.
            Thread_Boot.Start() ' Démarrage du thread.
        End Sub
     
        Private Sub Boot_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            StartThread()
        End Sub
    Mais j'ai une erreur sur AddressOf :

    L'expression 'AddressOf' ne peut pas être convertie en 'System.Delegate', car le type 'System.Delegate' est déclaré 'MustInherit' et ne peut pas être créé.

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 94
    Par défaut
    Bonjour,
    Le paramètre de Invoke doit être un delegate

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 97
    Par défaut
    Les BackgroundWorker servent à ça :

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    Imports System.ComponentModel
    Imports System.Threading
     
    Public Class Form1
     
        Protected BackgroundWorker As BackgroundWorker
     
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Me.BackgroundWorker = New BackgroundWorker()
     
            Me.BackgroundWorker.WorkerReportsProgress = True
     
            AddHandler Me.BackgroundWorker.DoWork, AddressOf Worker_DoWork
            AddHandler Me.BackgroundWorker.ProgressChanged, AddressOf Worker_ProgressChanged
     
            Me.BackgroundWorker.RunWorkerAsync()
     
        End Sub
     
        Private Sub Worker_ProgressChanged(ByVal sender As Object, ByVal e As ProgressChangedEventArgs)
            Dim message As String = e.UserState
     
            Me.Label1.Text &= message & Environment.NewLine
     
        End Sub
     
        Private Sub Worker_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs)
            Dim worker As BackgroundWorker = sender
     
            worker.ReportProgress(0, "Starting...")
     
            Thread.Sleep(1000)
     
            worker.ReportProgress(0, "Première étape")
     
            Thread.Sleep(3000)
     
            worker.ReportProgress(0, "Deuxième étape")
     
            Thread.Sleep(2000)
     
            worker.ReportProgress(100, "Terminé")
        End Sub
     
     
    End Class

Discussions similaires

  1. Problème avec fonction sleep
    Par pitxu dans le forum Apache
    Réponses: 2
    Dernier message: 07/02/2008, 03h27
  2. Problème avec fonction Sleep
    Par Evens dans le forum C++
    Réponses: 2
    Dernier message: 28/11/2007, 14h14
  3. [MFC][WINSOCK] Problème avec fonction recv
    Par Le Farfadet dans le forum MFC
    Réponses: 4
    Dernier message: 23/09/2005, 11h00
  4. Problème avec fonction d'envoie de mail
    Par zyg dans le forum Réseau/Web
    Réponses: 1
    Dernier message: 23/02/2005, 08h48
  5. [Requête] Problème avec fonction "DATE_FORMAT()"
    Par sekiryou dans le forum Requêtes
    Réponses: 4
    Dernier message: 11/01/2005, 21h52

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