Je fais un programme qui montre une croissance cellulaire à travers un tableau. Je l'ai donc obtenu lorsque j'appuie sur le bouton Démarrer, la matrice met à jour toutes les 10 secondes de temps (vrai) {} boucle. Le problème avec c'est que je veux pouvoir arrêter la boucle en appuyant sur le bouton de pause, mais pendant la boucle, il ne me laissera pas utiliser les commandes. J'ai besoin de quelque chose d'autre qu'une boucle infinie en boiser pour rafraîchir les cadres. p>
Je suis un peu un débutant, mais je suis dans une classe Java pour le moment. Donc, j'ai une certaine compréhension de la langue. P>
9 Réponses :
Vous voulez exécuter votre simulation dans un thread (rechercher une interface annulable). Ensuite, vous pouvez passer des messages à ce fil pour mettre en pause, continuer et arrêter. P>
Je suggérerais d'utiliser un fil séparé pour gérer le tableau. Assurez-vous d'utiliser un objet Safe Whle Safe (Vérifiez Java Docs) et appelez simplement .start () sur votre objet de thread lorsque vous souhaitez commencer. Gardez un pointeur pour cela pour que vous puissiez la mettre en pause via Setpaatilisée (vrai)
quelque chose comme ça .... p>
Étant donné que la puissance séparée et la fixation doit être appelée à partir d'autres threads, vous devez effectuer les booléens activés et en pause des booléens volatils, ou synchronisez-les lors de la lecture / de la définition.
Cela consommerait beaucoup de ressources si l'application est en pause pendant une longue période (1 min par exemple) car la boucle tandis que la boucle tandis que la boucle sera à pleine vitesse, seulement pour définir le fil pour dormir pour un milliseconde et recommencer à nouveau. Cela créerait des invocations inutiles de 60 000 (APROX), seulement pour un arrêt de 1 minute.
En fait, c'est une solution très mauvaise. Lorsqu'il est en pause == True, où il n'y a pas de travail à faire, ce code engage deux commutateurs de contexte (lecture: très coûteux) tous les 1 ms (en supposant que le système d'exploitation puisse fournir une telle précision et pourrait suivre). L'effet net serait un ralentissement des autres threads faisant des travaux réels. Une meilleure solution est de attendre i> jusqu'à la condition "pause == false" est vrai. Soit avec un verrou et un objet d'objet à l'ancienne, #.notifier ou via une java.util.concurrent.lock.locks.locks.lock / conditions appropriées. Bizarre de voir cette solution a le plus de votes!
La réponse de Paul Clapham est beaucoup mieux. Je serais surpris si SWT n'avait pas d'événement de minuterie similaire si l'application est effectuée dans celle-ci au lieu de balancer.
La période d'attente ou le verrouillage peut être géré de différentes manières différentes. Le sommeil (1) pourrait être configurable ou comme Dimitris commenté pourrait être verrouillé jusqu'à #Notify (j'aime cette méthode). En général, la méthode ci-dessus est une manière simple et générique de manipuler un processus fileté. Je ne discuterais pas non plus que la solution basée sur la minuterie ci-dessous est une solution valide, tant que l'administrateur utilise Swing et 1 seconde mises à jour sont suffisamment rapides pour lui.
Yep. On dirait que vous faites votre dessin sur le fil de répartiteur de l'événement. Événements (appuie sur la touche) n'a jamais eu la chance d'être appelé parce que vous n'avez jamais retourné le contrôle de la dernière fois qu'il a été appelé ... P>
Ce que vous cherchez est multi-threading. Prenez le traitement des données et mettez-le dans un deuxième fil, exécutez-le de manière asynchrone et utilisez le fil principal pour vérifier l'entrée de l'utilisateur. P>
Bien sûr, cela pourrait également impliquer à l'aide d'un sémaphore pour communiquer entre les deux threads. Quelle classe de niveau êtes-vous dans: avez-vous déjà couvert ces deux sujets? P>
Ahhhhh, je suis dans une classe Highschool Java comme un électif, alors mon entraînement est ... Minimal. Je n'ai pas ce que vous dites, mais je n'ai absolument aucune idée de la manière de le mettre en œuvre en code. Merci quand même.
Regardez les machines d'attente () / notifier (). En bref, un thread peut attendre 10 secondes, mais il est toujours notifié qu'un événement externe s'est produit, P>
Si ces "boutons" sont des boutons SWING, la manière de le faire est la suivante: avoir le bouton de démarrage créer un nouvel objet Javax.swing.Timer qui fait la mise à jour toutes les 10 secondes. Alors faites arrêter le bouton de pause que la minuterie. P>
Je préfère personnellement utiliser Le Votre code ressemblerait à: p> Minuterie Code> Classe plutôt que thread code> ou thread.sleep () code>. La classe de minuterie gère tous deux le code périodiquement et l'annulation.
Ce dont vous avez besoin est d'utiliser un Minuterie A> qui change l'état de votre composant (dans ce cas la croissance cellulaire), puis appelle Cette minuterie peut être annulé pour faire la pause, puis pour le redémarrer, vous créez simplement un Nouveau: p> afin que vous puissiez définir les deux méthodes suivantes: p> puis dans votre bouton "pause / reprise" invoquez cette "pause / startpaiting" "Méthodes: p> Voici le code source complet pour le voir exécuter: p> jComponent.repaint () code>
Merci, c'est exactement ce dont j'ai besoin. J'ai un peu de difficulté à le faire fonctionner dans mon code car sa mise en place un peu différemment que la vôtre. Mais "ll travailler dessus merci
@Luke, je suis content. Vous pouvez marquer ma réponse comme acceptée (je vous en dise cela parce que vous êtes nouveau à Stackoverflow: p)
Haha très bien. Y a-t-il une façon de vous envoyer mon code? J'ai le pire moment à comprendre comment obtenir ce que vous m'avez donné dans mon code? Je comprends beaucoup de choses à demander à un étranger, donc pas de soucis si c'est trop.
Bien sûr, mais je pense que ce sera beaucoup mieux si vous créez une nouvelle question ici. Je peux jeter un coup d'œil à cela ou à tout autre. Phrase comme suit: J'ai demandé à ce
Qu'entendez-vous par les boutons de démarrage et de pause? Votre programme est-il exécuté dans une interface graphique? Cet environnement est-il configuré pour votre classe?