IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

TimerCounter en dehors d'un Main


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de tarpal
    Homme Profil pro
    Ingénieur Electronique retraité
    Inscrit en
    Février 2016
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Electronique retraité
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2016
    Messages : 70
    Par défaut TimerCounter en dehors d'un Main
    Bonjour
    Je suis toujours en apprentissage de Java...
    J'ai un timer qui fonctionne parfaitement et donc voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    package horloge;
    public class TimerCounter 
    {
    	static Thread thread = new Thread();
    	public static void main(String[] args) throws InterruptedException
    	{
     
    	for ( int i=3 ; i>=0 ; i--)
    	    {
    		Thread.sleep(1000);;
     
    	    if (i==3)
    	    		{
    	    	    System.out.println(i+ "  :Première instruction");
    	    		}
    	    if (i==2)
    	            {
    	    	    System.out.println(i+ "  :Deuxième  instruction");
    	            }
    	    if (i==1)
                    {
    	            System.out.println(i+ "  :Troisième  instruction");
    	            System.out.println( " c'est terminé ");
                    }
    	     }
        }
    }
    Mon problème c'est que je n'aime pas ce genre de programme, où tout est fait dedans.
    J'aime bien avoir deux fichiers
    Un Main
    Une Class Timer
    ça fait un bon moment que je tourne en rond à partir de ce code pour avoir un main séparé avec sa class associée.
    Mon but final étant d'utiliser cette Class timer dans un autre programme.
    Puis-je avoir un peu d'aide?
    Merci à vous

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Il est difficile de donner une recette toute faite de comment transformer un programme séquentiel comme le tien en classes. Tout dépend de ce qu'il fait, de ce qu'on veut pouvoir faire.
    Normalement, on part plutôt sur les concepts de base, on apprend ce qu'est un objet, les concepts autour (héritage, polymorphisme, tout ça), on voit ce qu'on peut faire en terme de syntaxe Java, puis de base d'architecture (Design Pattern, SOLID, etc.), ce qui permet ensuite d'élaborer des architectures d'applications à partir des spécifications, et, ensuite, par habitude, de pouvoir refactoriser du code.

    Avant de commencer de parler de ton en programme en particulier, suffisament limité qu'on puisse trouver une solution simple et directe, juste une chose : ta variable thread est totalement inutile. Tu peux déjà la supprimer.

    Je dirais que le plus simple dans ton cas est de commencer déjà par extraire le code de la méthode de lancement. Deux solutions : mettre le code dans le constructeur, ou mettre le code dans une méthode. Personellement, je n'aime pas mettre un code "actif" dans le constructeur d'une classe. Le constructeur est fait pour construire : initialiser les variables, éventuellement charger des ressources, mais pas pour le code actif, même si ça fonctionne, et que, finalement, c'est plus simple en terme d'écritude de code.

    Donc tout simplement, on part sur un canevas avec une méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    package horloge;
    public class TimerCounter {
     
            public void run() {
            }
     
    }
    La méthode run() sera la méthode à appeler pour faire ce que tu veux que ça fasse, en l'occurence, ce que tu fais actuellement dans la méthode main(), donc tout simplement, copier/coller :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    package horloge;
    public class TimerCounter {
     
     
            public void run() throws InterruptedException {
                  for ( int i=3 ; i>=0 ; i--) {
                      Thread.sleep(1000);
     
                      if (i==3) {
    	    	    System.out.println(i+ "  :Première instruction");
    	    	  }
     	          if (i==2) {
    	    	    System.out.println(i+ "  :Deuxième  instruction");
    	          }
    	          if (i==1) {
    	            System.out.println(i+ "  :Troisième  instruction");
    	            System.out.println( " c'est terminé ");
                     }
    	     }
            }
     
     
    }
    Je passe sur la problématique du InterruptedException. C'est probablement prématuré à ton niveau.

    Maintenant, il faut pouvoir, comme toujours, lancer le programme, donc avoir une méthode main quelque part. Tu peux la mettre dans la classe TimerCount, mais si tu tiens à la mettre absolument dans une autre classe, on peut imaginer quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    package horloge;
    public class Launcher {
     
            public static void main(String[] args) throws InterruptedException {
     
                    TimerCounter timer = new TimerCounter(); // création d'une instance de classe TimerCounter
     
                    timer.run(); // appel de la méthode run
     
            }
     
    }
    Tant que les 2 classes font parties du même package, c'est tout ce qu'il faut.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre confirmé Avatar de tarpal
    Homme Profil pro
    Ingénieur Electronique retraité
    Inscrit en
    Février 2016
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Electronique retraité
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2016
    Messages : 70
    Par défaut
    Merci joel.drigo pour ta réponse (riche d'instruction pour moi )
    Je vais essayer d'exploiter tout ce que je découvre dans ta réponse.
    A+

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    NB : tu l'auras sans doute corrigée toi-même, mais j'ai fait une petite inversion (entre les mots static et void, dans la signature de la méthode main) dans l'exemple de la classe Launcher, que j'ai corrigée dans le message depuis.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre confirmé Avatar de tarpal
    Homme Profil pro
    Ingénieur Electronique retraité
    Inscrit en
    Février 2016
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Electronique retraité
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2016
    Messages : 70
    Par défaut
    Bonjour joel.drigo
    J'ai fini d'exploiter tes explications :
    ta variable thread est totalement inutile.
    Je l'ai supprimé, et ça marche.
    J'avais pris ce bout de code sur le Net et j'ai copié bêtement...
    Je n'ai pas bien compris sur les tutos le Tread.
    Si c'est trop long à expliquer, je lancerai un nouveau post sur le sujet.
    donc avoir une méthode main quelque part
    J'ai bien créé mon Main que j'ai appelé MainLauncher.
    Quand je regarde le titre de mes class, j'aime bien repérer du premier coup mon Main.
    J'ai donc mon nouveau code avec 2 fichiers : "MainLauncher" et "TimerCounter"
    ça marche et je te remercie pour ton aide.
    Je passe sur la problématique du InterruptedException.
    J'avais commencé à travaillé sur cette instruction...
    je l'avais trouvé quand je codais sur
    quand je voulais faire une temporisation dans mon code.
    Ici il se trouve dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public void run() throws InterruptedException
    Ce code ne me plais pas car je ne le comprend pas.
    Du coup j'ai une modification avec un code plus compréhensible pour moi...
    Le voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    package carenoHorloge3;
     
    public class MainLauncher 
    {
        public static void main(String[] args) 
        		//throws InterruptedException 
        {
            TimerCounter3 timer = new TimerCounter3(); // création d'une instance de classe TimerCounter
     
            try {
    			timer.run();
    		    } 
            catch (InterruptedException e) 
                {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		    } // appel de la méthode run
     
        }
     
    }
    Est-ce la même chose ?
    Encore Merci pour ton aide
    A+

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Bonjour tarpal,

    Citation Envoyé par tarpal Voir le message
    Je n'ai pas bien compris sur les tutos le Tread.
    Tu parles des tutos de Developpez ?

    J'ai bien créé mon Main que j'ai appelé MainLauncher.
    Quand je regarde le titre de mes class, j'aime bien repérer du premier coup mon Main.
    J'ai donc mon nouveau code avec 2 fichiers : "MainLauncher" et "TimerCounter"
    ça marche et je te remercie pour ton aide.

    Citation Envoyé par tarpal Voir le message
    [...]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public void run() throws InterruptedException
    et le mettre dans "Tread.sleep" avec une instruction " Try / Catch"
    [...]
    Je n'ai pas compris la différence...
    La différence entre le try/catch et le throws est :

    • dans le cas du catch, tu attrapes l'exception : tu décides donc que c'est là qu'il faut la traiter
    • le throws relance l'exception vers l'appelant : on ne sait pas comment la traiter, donc on la lance à l'appelant.


    Dans le cas particulier de l'InterruptedException, le thread courant, qui était endormi le temps de la pause, a été réveillé prématurément. Il y a plusieurs façon de traiter l'exception :

    1. la relancer par un throws, on ne sait pas quoi faire, on relance, l'appelant s'en chargera
    2. on ne peut pas toujours relancer. Par exemple, si on utilise un Runnable, on n'a pas la possibilité de changer la signature de la méthode : on communique l'interruption à l'appelant via l'état interupted : Thread.currentThread().interrupt()
    3. si le thread se termine juste après, ce n'est pas très important de s'en préoccuper, à fortiori si l'application s'arrête
    4. le traitement peut être simplement de finir le thread aussi, tant qu'on est en haut de la pile d'appel, il y a rien au dessus qui pourrait traiter de tout manière, comme dans ce genre de cas :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      public static void main(String[] args) {
             boolean loop=true; 
             System.out.println( "I'm alive!" );
             while(loop) {
                 try {
                     Thread.sleep(1000);
                     System.out.println( "I'm still alive!" );
                }
                catch(InterruptedException e) {
                    loop=false; // on arrête la boucle et on laisse le programme se terminer tranquillement
                }
            }
             System.out.println( "Goodbye Cruel World" );
             System.out.println( "I'm leaving you today" );
       
      }

    Dans ton cas, le plus important était que ça compile au moins. J'ai laissé le throws comme tu l'avais mis dans ton code. Le souci est juste que ça va afficher une stacktrace au cas où le thread est interrompu, et que ce n'est pas forcément ce qu'on veut (le fait qu'un thread soit interrompu n'est pas forcément un problème en soit, tant qu'on fait ce qu'on doit faire correctement (fermer correctement les ressources, s'assurer de la cohérence des résultats, des données en base, etc), on n'est pas toujours obligé d'avertir qui que ce soit qu'on n'a pas attendu aussi longtemps qu'on devait. On on peut simplifier on ne loguant que juste par un simple message, sans balancer une stacktrace de 500 lignes.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utilisation d'une variable en dehors de la classe main
    Par snyler dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 27/01/2015, 14h32
  2. API windows en dehors de main.c
    Par theclem35 dans le forum Débuter
    Réponses: 2
    Dernier message: 20/03/2011, 20h29
  3. pthread_create( ) en dehors de main( )
    Par ikuzar dans le forum POSIX
    Réponses: 1
    Dernier message: 12/08/2009, 17h44
  4. Programme de boot qui passe la main à Windows
    Par Bob dans le forum Assembleur
    Réponses: 7
    Dernier message: 25/11/2002, 03h08
  5. Réponses: 2
    Dernier message: 17/03/2002, 19h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo