2010-02-10 16 views
7

Je googlé pour cela et lire quelques fils, mais je n'ai pas trouvé un moyen simple d'avoir un sommeil d'application VB.Net pour un peu de temps et de toujours garder l'application réactive:Une façon simple et non bloquante de dormir?

Imports System.Net 
Imports System.IO 
Imports System.Text 
Imports System.Text.RegularExpressions 
Imports System.Threading.Thread 

[...] 

''#How to keep screen frop freezing? 
While True 
    ListBox1.Items.Clear() 

    ListBox1.Items.Add("blah") 

    ''#Not much difference 
    ListBox1.Refresh() 

    ''#Wait 1mn 
    Sleep(60000) 
End While 

Est-il vraiment pas de solution simple et non bloquante pour attendre une application VB.Net pendant quelques secondes?

Merci.

+1

Quel est le but du sommeil? Vous voulez soit dormir, ou vous voulez qu'il soit réactif. Si ce que vous essayez de faire est quelque chose qui se produit à intervalles réguliers, alors dites-le. – dbasnett

+0

Je suis l'écran raclant une page Web chaque minute, et voudrais que l'application fasse une pause chaque minute sans que l'écran de l'application ne gèle. Est-il toujours possible d'utiliser DoEvents ou est-il recommandé d'utiliser un Timer à la place? – Gulbahar

+0

@OverTheRainbow - Voir le commentaire de nikie ci-dessous. On dirait que vous êtes mieux avec une minuterie. –

Répondre

7

Est-ce WinForms ou WPF? S'il s'agit de WinForms, vous pouvez simplement utiliser une minuterie au lieu d'une boucle while. Ensuite, votre application sera toujours réactive et déclenchera des événements.

Dans WPF, je pense que vous devez créer votre propre horloge basée sur le DispatchTimer class.

+0

Y a-t-il des temporisateurs dans WPF aussi? – CoderDennis

+0

Je viens d'ouvrir un projet vraiment rapide et je n'ai vu aucun contrôle Timer dans le concepteur, donc très bien, je n'ai jamais eu besoin d'en utiliser un dans WPF. Une recherche rapide sur google me fait penser que ce n'est pas disponible (http://social.msdn.microsoft.com/forums/en-US/wpf/thread/aaffea95-e735-492d-bd8a-2fdf7099a936/). –

+0

Il ne doit pas être un contrôle le fait? Vous pouvez utiliser System.Timers.Timer ou System.Threading.Timer dans le code. – ryadavilli

2

La suggestion Timer est vraiment la meilleure façon de le faire. Mais si DoEvents fonctionne encore (je ne l'ai pas fait depuis VB 5.0), vous pouvez le faire:

For i = 0 To 600 
    DoEvents 
    Sleep(100) 
Next 

Cela ferait 600 sommeils de 0,1 secondes chacun, avec un DoEvents entre chaque pour gérer les événements actuels. Le .1 seconde devrait être un bon compromis entre la réactivité (les événements sont traités en 0,1 seconde) et la consommation du CPU (faites cela trop vite et votre application commencera à consommer une quantité importante de temps processeur en attendant).

+0

Cher downvoter, alors que j'accepte respectueusement votre downvote, envisageriez-vous de laisser un commentaire avec lequel je pourrais améliorer ma réponse? Merci. – Wim

+0

Je ne sais pas pourquoi cela a été downvoted non plus. Les fonctions sont appelées Application.DoEvents et Thread.Sleep dans .NET, mais toute personne disposant d'un MSDN à jour aurait pu le découvrir. DoEvents peut conduire à toutes sortes de comportements bizarres (par exemple si le formulaire est fermé pendant que la fonction est en cours d'exécution ou si DoEvents appelle à nouveau la même fonction). Mais vous avez dit que ce n'est pas la façon idéale de le faire . – Niki

+1

Je ne suis pas le downvoter, mais DoEvents n'est pas une bonne pratique. Cela provoque des problèmes si la méthode n'est pas correctement écrite pour prendre en compte la ré-entrée. –

7
Public Sub ResponsiveSleep(ByRef iMilliSeconds As Integer) 
    Dim i As Integer, iHalfSeconds As Integer = iMilliSeconds/500 
    For i = 1 To iHalfSeconds 
     Threading.Thread.Sleep(500) : Application.DoEvents() 
    Next i 
End Sub 

Appelez ResponsiveSleep pour suspendre un code particulier tout en conservant une réactivité suffisante à l'application. Pour rendre l'application plus iHalfSeconds sensibles pourraient être modifiés pour dixièmes ou centièmes de seconde

+1

Cette méthode utilisait moins de ressources processeur que le chronomètre. – rsrobbins

+2

J'ai eu des problèmes avec 'Application.DoEvents()'. Voir [ici] (https://social.msdn.microsoft.com/Forums/vstudio/en-US/48b4a763-7387-46da-8fc2-3e885670f62c/the-undo-operation-encountered-a-context-that-is -different? forum = netfxbcl), par exemple. – pelesl

+0

est que ':' construction quelque chose VB-spécifique? Comment cela ressemblerait-il à C#? – Nyerguds

4
Private Sub wait(ByVal interval As Integer) 
    Dim stopW As New Stopwatch 
    stopW.Start() 
    Do While stopW.ElapsedMilliseconds < interval 
     ' Allows your UI to remain responsive 
     Application.DoEvents() 
    Loop 
    stopW.Stop() 
End Sub 
2

Vraiment, la solution est double: 1. ) Utilisez une minuterie au lieu de dormir, le sommeil ne comme il est dit, les causes le fil pour dormir. 2.) Utilisez le multi-threading et faites fonctionner la fonction de mise au rebut de l'écran dans son propre thread, cela améliorera grandement la réactivité de votre application.

Threading.Thread.Sleep(IntSleepTime) 

est un fil fonction de sommeil sécuritaire qui se met en pause le thread courant pendant la durée spécifiée, donc si vous deviez utiliser le sommeil, vous pouvez le faire dans un environnement multi-threading et il gardera le reste de votre application sensible que vous êtes seulement en train de dormir un fil ramifié, pas le fil principal.

0

U sont faire le fil de l'interface utilisateur Qui remettant la forme à dormir. Si vous voulez que votre application soit réactive, commencez par créer une méthode qui ajoutera les éléments dans la vue de liste et quand les chargements initiaux commenceront cette méthode en utilisant thread, utilisez dorénavant sleep pour rendre votre thread de vue de liste sleep, et ur from responsive état ..

0

Ceci est pour VB pas VBA

Private Async Function PauseTime(ByVal MS As Integer) As Task 

    Await Task.Run(Sub()       
          Thread.Sleep(MS) 

        End Sub) 


    End Function