C# Sommeil de 500 millisecondes
Pourriez-vous me dire comment dois-je faire à propos de la suspension de mon programme pour 500 millisecondes et puis continuer?
J'ai lu Thread.Sleep(500)
n'est pas bon car il tient le thread GUI.
L'aide d'une minuterie se déclenche un rappel ...
Je veux juste attendre 500ms et puis continuer à l'instruction suivante.
Veuillez en informer.
EDIT: j'ai besoin d'afficher une barre de message pour 500ms et ensuite mettre à jour le message avec un autre. Désolé, je voulais dire 500 pas 50.
EDIT: je comprends ce que tout ce que vous avez dit. mais: [je veux juste attendre 500ms et puis continuer à l'instruction suivante.] Je le pense parce que c'est un si court intervalle, je vais faire un Thread.Sleep(500) sur le thread GUI. Sinon, je dois réécrire beaucoup de code pour accueillir ce bref intervalle de 500 millisecondes.
EDIT: je vais essayer de reformater mon message d'état de sorte que la pause n'est pas nécessaire.
OriginalL'auteur iTEgg | 2010-03-27
Vous devez vous connecter pour publier un commentaire.
Hmya, ce que vous essayez de faire est assez fondamentalement incompatible avec le modèle de programmation Windows. Un natif de Windows le programme est basé sur l'événement. Votre programme est toujours inactif, assis à l'intérieur d'une boucle commencée par l'Application.Run(), en attente pour Windows pour dire que quelque chose d'intéressant qui s'est passé qu'il doit répondre. Demandes de peinture, les clics de souris, les expirations de timers, des trucs comme ça.
Votre programme doit répondre à ce filtre et ce qui est intéressant pour vous. Lorsque vous déposez un bouton sur un formulaire, vous êtes toujours intéressés dans l'événement Click, généré lorsque Windows envoie le MouseDown message de notification. Votre gestionnaire d'événements Click exécute une sorte de code personnalisé que vous écrivez. La mise à jour de statut la barre de message dans votre cas.
La mise à jour de la barre d'état message d'une demi-seconde plus tard, ne pas faire tout un heckofalot de sens. Ce qui s'est exactement passé au cours de ces 500 millisecondes qui a changé la façon dont votre programme répond aux événements? Vous pouvez appeler la méthode Update() de la Barre d'état de sorte que le nouveau message est visible, Système d'appel.Le filetage.Fil de discussion.Sleep(500) pour obtenir ce que vous voulez. Vous allez sortir avec elle, le "Pas de Réponse" fantôme que Windows met en place prend votre programme de mort pendant plusieurs secondes.
Mais cela ne fait pas beaucoup de sens, rien ne s'est passé au cours de cette demi-seconde, l'état de votre programme n'a pas changé. Il ne pouvait pas changer, il était mort de Windows et de ne pas recevoir de messages qui permettent de changer l'état.
Eh bien, c'est ce que je peut prendre ce. Veuillez mettre à jour votre question et expliquer pourquoi vous avez besoin pour ce faire. Juste au cas où: si vous envisagez de ce faux faire quelque chose d'important pour une demi-seconde, l'utilisateur ne sera pas impressionné. Elle va finalement l'avis de votre INTERFACE utilisateur est mort pendant une demi-seconde sans rien à montrer pour elle.
Est-ce à dire que vous souhaitez informer vos utilisateurs sur les étapes que vous avez pris dans votre code? Qui n'a pris que quelques millisecondes, trop vite pour que l'utilisateur puisse voir? Non, elle n'est pas intéressée, elle se soucie de la suite. Vous avez déjà fait la bonne Chose, vous vous assurez que cela a été fait vraiment rapide. Bon travail, vos collègues programmeurs vont l'apprécier. Pas votre nom d'utilisateur. Eh bien, elle le fait, elle n'attend que ça.
Je vous remercie. De nouveau, j'ai bien aimé votre réponse car elle m'a fait réviser mes actions et objectifs. Parfois, il est préférable de proposer des pensées que le code de solutions.
Madison? Wisconsin? C'est sympa, mais je suis en Angleterre!
google email - got. merci.
OriginalL'auteur Hans Passant
Vous avez deux choix:
À partir de votre mise à jour, il semble que la seule chose que vous voulez faire est de changer un seul champ. Je recommanderais certainement la première méthode: à l'aide d'une minuterie. Le démarrage d'un BackgroundWorker pour cette tâche est exagéré, et vous donneront seulement inutile, le travail supplémentaire et les complications.
Pourquoi ne pas vous souhaitez un rappel? Vous pouvez mettre votre rappel inline dans votre première fonction que si votre raison d'éviter les rappels, c'est que vous voulez garder les choses ensemble. Mais il me semble que la seule réponse que vous serez heureux avec est si quelqu'un vous dit d'utiliser
Application.DoEvents()
. Il sera sans doute mais ce n'est pas la meilleure façon de le faire.OriginalL'auteur Mark Byers
Au lieu de la suspension de l'INTERFACE utilisateur directement pendant 500 ms, vous pouvez toujours utiliser un BackgroundWorker. Qui sera la cause de votre callback à exécuter dans un thread séparé, où vous pouvez utiliser
Thread.Sleep
pour le mettre en pause sans le blocage de l'INTERFACE utilisateur. Puis, quand vous avez terminé, il suffit de mettre à jour la barre de statut avec votre nouveau message.OriginalL'auteur Justin Ethier
Plus de contexte à la question serait utile.
Thread.Sleep(50)
interrompre le thread en cours de 50 millisecondes. Si vous ne le faites pas dans le thread de l'INTERFACE utilisateur, alors oui, il va geler l'INTERFACE utilisateur pour les 50 millisecondes. Toutefois, si vous utilisez un autre thread pour faire cette transformation, puis de l'appel d'Sleep
sur ce thread va le mettre en pause pour les 50 millisecondes sans geler vos thread d'INTERFACE utilisateur.Voir la réponse de Marc de cette question pour un exemple sur l'utilisation d'un
BackgroundWorker
exemple de faire ce que vous avez besoin.OriginalL'auteur Aaron Daniels
En C#, votre meilleur pari est d'utiliser la Minuterie et le feu d'un rappel.
En F#, il y a un moyen extraordinaire de faire ce que vous voulez, voir
F# asynchrone sur le côté client
qui montre comment écrire droite ligne de code et avoir la langue prendre soin des rappels pour vous.
OriginalL'auteur Brian
Vous avez besoin d'allouer un autre thread. Dans ce thread, vous
Sleep(500)
et de modifier les données nécessaires. Attention: vous devez utiliser le thread d'origine du répartiteur, parce que les données liées à l'INTERFACE utilisateur doivent être mis à jour depuis le thread GUI.OriginalL'auteur Vlad