2017-08-05 4 views
0

J'apprends java et jusqu'ici j'ai créé une vérification de mot de passe en utilisant des instructions if. Cependant j'ai inséré mon contrôle de chaîne de travail dans une boucle while et ajouté Thread.sleep (3000); pour un délai de 3 secondes, mais une fois que j'ai terminé que mon interface graphique continue juste de retarder et de geler sur une page comme si le bouton a été pressé. Quelqu'un peut-il me montrer comment faire un exemple de code avec une vérification de chaîne et après un certain nombre d'essais un délai pour empêcher l'utilisateur d'essayer à nouveau? (voici ce que j'ai :)java- Comment créer une vérification de chaîne avec un délai d'une certaine durée?

//var declaration 
    boolean match = false; 
    String1 = "hi"; 
    String2 = (I know this is not code but just to omit some code:) userInput 
    int time = 3000; 
    int attempt = 0; 
    //check 
    while(!match && attempt < (maximumTries+1)){ 
     if(String1.equals(String2)){ 
      System.out.print("match"); 
     } 
     else if(attempt < 11){ 
      attempt++; 
      System.out.println("Failed:" + attempt); 
     } 
     else{ 
      attempt++; 
      System.out.println("Please try again later you have:" + attempt + "failed attempts"); 
      try{ 
       Thread.sleep(time); 
      } 
      catch(InterruptedException ex) { 
       Logger.getLogger(PasswordEntry.class.getName()).log(Level.SEVERE, null, ex); 
      } 
      time = time + 1000;//1 second more every time 
     } 
    } 
+2

Utilisez [timers] (https://docs.oracle.com/javase/7/docs/api/java/util/Timer.html) au lieu de sleep. – BladeMight

+0

Comment utiliser la minuterie avec un temps spécifique? minuterie (heure)? –

+1

voir ici https://stackoverflow.com/questions/2258066/java-run-a-function-after-a-specific-number-of-seconds – BladeMight

Répondre

1

votre code est en train de faire une boucle infinie, une fois la première tentative ne correspond pas.

Dans chacune des itérations de votre boucle, il n'y a aucun changement, hormis l'incrémentation du compteur. donc le compteur augmente juste pour toujours (avec quelques retards entre les deux).

Il semble que le raisonnement derrière votre code était que String2 a été mis à jour avec l'entrée utilisateur à l'intérieur de la boucle pas en dehors de. De cette façon, à chaque itération, vous auriez un String2 différent à comparer.

C'est votre problème, pas la façon dont vous retardez entre les tentatives (cela peut certainement être amélioré dans tous les cas).

1

Vous devez éviter d'utiliser l'option Thread.sleep, car elle gèle complètement le thread principal. Vous pouvez également essayer de créer un autre thread, qui sera gelé et, plus tard, donnera un rappel à la thread principale. Par exemple à travers une variable booléenne. Je suis également d'accord sur la solution de minuteur mentionnée par BladeMight.