7
votes

Java, remplacement des boucles infinies?

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.

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.


1 commentaires

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?


9 Réponses :


1
votes

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.


0 commentaires

10
votes

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 .... xxx


5 commentaires

É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 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.



0
votes

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é ...


0 commentaires

0
votes

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.

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?


1 commentaires

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.



0
votes

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,


0 commentaires

2
votes

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.


0 commentaires

1
votes

Je préfère personnellement utiliser Le Minuterie Classe plutôt que thread ou thread.sleep () . La classe de minuterie gère tous deux le code périodiquement et l'annulation.

Votre code ressemblerait à: xxx


0 commentaires

10
votes

Ce dont vous avez besoin est d'utiliser un Minuterie qui change l'état de votre composant (dans ce cas la croissance cellulaire), puis appelle jComponent.repaint ()

Cette minuterie peut être annulé pour faire la pause, puis pour le redémarrer, vous créez simplement un Nouveau:

afin que vous puissiez définir les deux méthodes suivantes: xxx

puis dans votre bouton "pause / reprise" invoquez cette "pause / startpaiting" "Méthodes: xxx

Voici le code source complet pour le voir exécuter: xxx


4 commentaires

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 et j'ai ce problème pour le faire fonctionner (décrire un problème spécifique que vous avez). J'aimerais travailler comme solution d'Oscar, mais mon code ne fonctionne pas. Mon code est ici ) Si vous avez plusieurs questions, postez chacun sur chacun. Je pense que vous aurez une meilleure chance de le faire fonctionner.



0
votes

Une autre façon de gérer ce problème consiste à utiliser BlockingQueue d'emplois.


0 commentaires