2013-03-09 3 views
1

Je veux créer un programme qui chaque fois que l'utilisateur cliquera sur le bouton de démarrage, le programme dormira entre 3 secondes à 10 secondes, puis un bouton apparaîtra pour permettre à l'utilisateur de cliquer sur ce bouton, l'heure imprimera et indiquera à l'utilisateur combien de temps cela prend en millisecondes pour que l'utilisateur clique sur le bouton. sommeil aléatoire entre un ensemble de temps

Je sais que je dois utiliser Thread.Sleep() et Environment.TickCount()

Le problème est que je ne sais pas comment faire le sommeil du programme aléatoire entre 3-10 sec

Merci pour la réponse. Tout fonctionne mais un petit problème se produit

Le problème est que la première étiquette n'écrit pas "Préparez-vous ..." mais elle dort pendant 3 à 10 secondes avant d'imprimer "Préparez-vous ...". Ce que je veux, c'est que le programme imprime "Préparez-vous ..." et ensuite dormez pendant 3-10 sec.

Voici le code:

//Starts the count 
    private void btnStart_Click(object sender, EventArgs e) 
    { 
     label1.Text = "Get ready..."; 

     //Generate random sleeptime 
     Random waitTime = new Random(); 
     seconds = waitTime.Next(3 * 1000, 11 * 1000); 

     //Put the thread to sleep 
     System.Threading.Thread.Sleep(seconds); 

     //Show the button 
     btnNow.Show(); 
     label2.Text = "NOW!"; 

     //Count the time in milliseconds 
     start = Environment.TickCount; 
    } 
+0

Il existe une classe 'System.Random', regardez [ici] (http://msdn.microsoft.com/fr-fr/library/vstudio/system.random.aspx). –

+1

Le sommeil prend des millisecondes et avec la classe Random vous pouvez produire des nombres aléatoires. Maintenant vous avez tous les bits dont vous avez besoin pour commencer à coder. – rene

+0

@rene jeu de mots intentionnel? – christopher

Répondre

5

Vous devez utiliser la classe aléatoire:

Random rnd = new Random(); 
int number = rnd.Next(3,11); 

Jetez un oeil à la référence: http://msdn.microsoft.com/en-US/library/2dx6wyd4.aspx

Notez que le premier paramètre entier est inclusif, tandis que le deuxième paramètre est exclusif. Donc, vous devez utiliser 11 et non 10. (Si vous voulez exclure 10 secondes, vous devez changer cela bien sûr à "10").

Vous pouvez multiplier ce nombre par 1000 pour obtenir votre valeur en millisecondes et utiliser Thread.Sleep avec cette valeur.

+0

Ne créez pas un nouvel objet aléatoire à chaque fois, mais en procédant ainsi, en fonction de la fréquence d'exécution du code, vous obtiendrez le même nombre "aléatoire" à chaque fois. – ChrisF

+0

Merci pour la réponse. Tout fonctionne mais un petit problème se produit Le problème est que le premier label n'écrit pas "Préparez-vous ..."mais il dort pendant 3-10 secondes avant d'imprimer" Préparez-vous ... "Ce que je veux, c'est que le programme imprime" Préparez-vous ... "et ensuite aller dormir pendant 3-10 sec. –

3

Utilisez

Random random = new Random(); 
mseconds=random.Next(3, 10) * 1000; 
System.Threading.Thread.Sleep(mseconds); 
+0

Ne créez pas un nouvel objet aléatoire à chaque fois, mais en procédant ainsi, en fonction de la fréquence d'exécution du code, vous obtiendrez le même nombre "aléatoire" à chaque fois. – ChrisF

+0

Merci pour la réponse. Tout fonctionne mais un petit problème se produit Le problème est que la première étiquette n'écrit pas "Préparez-vous ..." mais elle dort pendant 3 à 10 secondes avant d'imprimer "Préparez-vous ...". Ce que je veux, c'est que le programme imprime "Préparez-vous ..." et ensuite dormez pendant 3-10 sec. –

+0

@VoDanh essayez Application.DoEvents() après avoir défini le texte sur l'étiquette. – cansik

0

La raison pour laquelle le texte ne change pas est que vous mettez le thread graphique en mode veille. Vous pouvez résoudre ce problème en appelant la méthode Application.DoEvents après avoir modifié le texte de l'étiquette, mais il serait préférable de faire le comptage dans un thread séparé.

Questions connexes