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 :

Besoin de votre aide


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2018
    Messages : 18
    Par défaut Besoin de votre aide
    Bonjour,

    Je viens demander de l'aide car je n'arrive plus a avancer.

    En effet j'étais sur une bonne lancer niveau avancement cependant voici mon problèmes :

    Vous pouvez constater à travers cette première partie de code un "Planning" qui, à différents moment de la journée veut faire effectuer des taches en changeant un "int indic" qui a pour valeur de défaut "0".

    Lorsque cette variable va changer en : 0, 1, 2 ou 3 des taches sont "censés" s'effectuer.

    Cependant voila mon problèmes :

    Effectivement lorsque le script va se mettre en route le planning va rediriger vers la condition "if" 0, 1, 2, ou 3; mais lorsque le script va se diriger vers l'une de ces conditions, le "Planning" ne va plus s'actualiser et donc plus rediriger vers une autre condition.

    La réponse à mon problème serait donc d'actualiser continuellement mon "Planning" (comme sur Unity avec la fonction "update" ou lors du développement d'app android) sans déranger les taches occupés dans les fonctions "if"


    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
    28
    29
    30
    31
    32
    33
    34
     
    			// Création table d'heure
    			Date Time = new Date();
    			DateFormatSymbols monDFS = new DateFormatSymbols();
    			SimpleDateFormat dateFormatH = new SimpleDateFormat("HH:mm", monDFS );
    			String TimeF= dateFormatH.format(Time);
    			System.out.println("Time : "+TimeF);
     
    			// Planning 
    				switch (TimeF)
    				{
    				  case "05:30": 
    					  indic = 1;
    				    break;
    				  case "11:30":
    					  indic = 3;
    				    break;
    				  case "14:00":
    					  indic = 2;
    				    break;
    				  case "16:30":
    					  indic = 1;
    				    break;
    				  case "19:00":
    					  indic = 2;
    				    break;
    				  case "21:45":
    					  indic = 3;
    				    break;
     
    				  default:
    					  indic = 0;
    				}
    			}
    Action numéro 1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(indic==1){
     
    // Mon code
     
    }
    Action numéro 2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(indic==2){
     
    // Mon code
     
    }
    Action numéro 3 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(indic==3){
     
    // Mon code
     
    }
    Si rien ne se passe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(indic==0){
     
    // Fonction par défaut
     
    }



    Merci par avance pour votre aide.

    Cordialement.

  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,

    1. C'est quoi ce "planning" ? Un composant Swing ?
    2. Et ta variable indic, elle est déclarée où ?
    3. C'est quoi ces histoires de scripts ? Ce sont des scripts externes ? En quel langage ?
    4. Je ne comprends pas bien cette histoire de mise à jour continuelle :
      1. est-ce qu'une sélection de date déclenche un nombre d'actions (la valeur de indic), et l'affichage change en conséquence
      2. ou la sélection de date mets à jour indic et ensuite il y a une tâche de fond qui met à jour je ne sais quoi toutes les n secondes, ou en fonction de résultats produits par les "indic" actions déclenchées (à chaque fois qu'un résultat est produit)
      3. autre ?


    Il faudrait en dire un peu plus pour qu'on puisse te répondre.

    Par ailleurs, par rapport au code que tu montres, il me semble plus simple et efficace d'utiliser une Map et d'utiliser des LocalTime.

    Exemple de principe (je t'ai mis des variantes de la méthode getAction qui permettent d'obtenir l'action en fonction de différents types, tu pourras utiliser celui qui convient le mieux en fonction de la variable qui désigne l'heure) :
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    import java.time.LocalTime;
    import java.time.ZoneId;
    import java.time.format.DateTimeFormatter;
    import java.util.Collections;
    import java.util.HashMap;
    import java.util.Map;
     
    public class PlanningExemple {
     
    	private static final Map<LocalTime,Integer> PLANNING_ACTIONS = createPlanning();
    	private static Map<LocalTime, Integer> createPlanning() {
    		Map<LocalTime,Integer> actions = new HashMap<LocalTime,Integer>();
     
    		actions.put(LocalTime.of(5, 30), 1);
    		actions.put(LocalTime.of(11, 30), 3);
    		actions.put(LocalTime.of(14, 0), 2);
    		actions.put(LocalTime.of(16, 30), 1);
    		actions.put(LocalTime.of(19, 30), 2);
    		actions.put(LocalTime.of(21, 45), 3);
     
    		return Collections.unmodifiableMap(actions);
    	}
    	public static int getAction(LocalTime time) {
    		return PLANNING_ACTIONS.getOrDefault(time, 0);
    	}
     
    	public static int getAction(String time) {
    		return getAction(LocalTime.parse(time,DateTimeFormatter.ofPattern("HH:mm")));
    	}
     
    	public static int getAction(int hours, int minutes) {
    		return getAction(LocalTime.of(hours, minutes));
    	}
     
    	public static int getAction(java.util.Date time) {
    		return getAction(time.toInstant().atZone(ZoneId.systemDefault()).toLocalTime());
    	}
     
    	public static void main(String[] args) {
     
    		LocalTime localTime = LocalTime.of(19, 30);
     
    		int indic = PlanningExemple.getAction(localTime);
     
    		System.out.println(localTime + " : " + indic);
     
    	}
     
    }
    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 averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2018
    Messages : 18
    Par défaut
    Bonjour,

    Merci d'avoir essayé de comprendre mon problème et désolé si je me suis mal expliquer.
    Il s'agit d'un BOT qui, à différents moments de la journée doit effectuer des actions (d'ou l'histoire du planning) et c'est ces actions (qui sont sous forme de boucle) qui se trouvent à l'intérieur des "if(indic==x).." .

    1 - Ma variable indic, est déclarée au début de mon code et je croyais m'en servir justement comme "indicateur" afin de rediriger mon code vers les actions.
    2 - Ces scripts sont comme dit au début : des actions que devra exécuter le BOT.
    Ces scripts sont en java et à la suite du planning(mais peuvent être adapter selon la solution trouvée).

    Pour ce qui est des mises à jour continuelle:
    Oui, la sélection de date mets à jour indic et ensuite il y a une tâche de fond qui exécute des actions.
    Et c'est en fonction des résultats produits par "indic" qu'il va s'agir d'actions contenu dans un if(indic==x) ou if(indic==y).

    Merci par avance de votre réponse.
    Cordialement.

  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
    Citation Envoyé par spritrl Voir le message
    Il s'agit d'un BOT qui, à différents moments de la journée doit effectuer des actions (d'ou l'histoire du planning) et c'est ces actions (qui sont sous forme de boucle) qui se trouvent à l'intérieur des "if(indic==x).." .
    Donc, il n'y a pas d'interface graphique, c'est bien ça ? Parce que la solution n'est pas la même s'il y a ou pas.

    En gros, si je comprends bien, tu veux pouvoir exécuter un code en fonction de indic sans bloquer la boucle principale (qui traite une date), dans un processus parallèle donc. Sans interface graphique, la solution de base est le thread. Il existe des "extensions" qui permettent de gérer ça (avec des threads) mais plus facilement, comme les services d'exécutions, ou les timers, selon les besoins, ainsi que certaines possibilités des streams pour traiter des collections d'objets avec parallélisation.

    Citation Envoyé par spritrl Voir le message
    1 - Ma variable indic, est déclarée au début de mon code et je croyais m'en servir justement comme "indicateur" afin de rediriger mon code vers les actions.
    La question concernait surtout la portée de la variable. Au début du code, ça ne veut pas dire grand chose en Java, un langage objet, à part qu'elle pourrait être déclarée locale à la méthode main, au début de cette méthode. La portée de la variable est important en multi thread, en particulier si plusieurs threads ont accès à cette variable, potentiellement simultanément en particulier.

    Citation Envoyé par spritrl Voir le message
    2 - Ces scripts sont comme dit au début : des actions que devra exécuter le BOT.
    Ces scripts sont en java et à la suite du planning(mais peuvent être adapter selon la solution trouvée).
    Des méthodes Java donc (il n'y a pas vraiment de script en Java).

    Citation Envoyé par spritrl Voir le message
    Pour ce qui est des mises à jour continuelle:
    Oui, la sélection de date mets à jour indic et ensuite il y a une tâche de fond qui exécute des actions.
    Et c'est en fonction des résultats produits par "indic" qu'il va s'agir d'actions contenu dans un if(indic==x) ou if(indic==y).
    Ce qui n'est pas encore clair pour moi c'est le processus. Surtout qu'un if est exécuté dans une séquence, à un moment déterminé. Ce n'est pas comme si c'était un élément réactif qui réagissait au changement d'une valeur. Tu penses peut-être à une boucle while ? A priori, je pense que tu n'as pas besoin de ces ifs, et le while est potentiellement une mauvaise solution (ou du moins problématique) mais comme je n'ai que très peu d'informations sur le processus, c'est difficile pour moi de voir exactement de ce que tu cherches à faire. On pourrait même peut-être se passer de indic. Dans l'exemple que je t'ai donné avec la map, on pourrait remplacer les Integer par des actions (des objets avec une méthode qui fait l'exécution).

    Est-ce que le but est de faire une action particulière à intervalle régulier dont le code varie en fonction de indic ? En résumé, quand l'heure change, l'action change.

    Et ces actions, elles font quoi ? Elles tournent en boucle jusqu'à ce qu'on change indic ? Elles tournent en boucle, mais ne font quelque chose que si indic correspond à une certaine valeur, sinon rien. Est-ce qu'elles tournent en boucle, mais seulement pour faire un truc de temps en temps, et le reste du temps ne font rien (ou attende) ? Sinon, si ce ne sont pas des boucles, l'exécution est-elle relativement courte ou plutôt longue ?

    A noter que pour l'exécution en parallèle, il est important de prendre en compte l'accès simultané et concurrent des objets par plusieurs processus en même temps. C'est pourquoi une compréhension plus précise de ta problématique me permettra de te suggérer des solutions plus ou moins adaptées, efficaces, performantes et simples d'emploi.
    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 averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2018
    Messages : 18
    Par défaut
    Aucunes interface graphique c'est ça,
    Comment pourrais je procédé avec des thread car :
    Oui, le but est d’effectuer une action particulière à intervalle régulier.
    Oui, les actions tournent en boucle jusqu'à ce qu'on change indic
    Et donc en gros : quand l'heure change, l'action change

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2018
    Messages : 18
    Par défaut
    J'ai essayé les threads mais sans succès..
    Lorsqu'une action se lance le planning cesse de s'exécuter..
    Ou est l'erreur?

    Main.java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public class main {
    	public static void main(String[] args) {
    		 new Thread(new Planning()).start();
    	}
    }
    Planning.java
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    public class Planning implements Runnable {
     
     
    	public void run() {
     
    			Thread Action1 = new Thread(new Action1());
    			Thread Action2 = new Thread(new Action2());
    			Thread ActionDefaut = new Thread(new ActionDefaut());     
     
    							// Création table d'heure
    							Date Time = new Date();
    							DateFormatSymbols monDFS = new DateFormatSymbols();
    							SimpleDateFormat dateFormatH = new SimpleDateFormat("HH:mm", monDFS );
    							String TimeF= dateFormatH.format(Time);
    							System.out.println("Time : "+TimeF);
     
    							// Planning 
    							switch (TimeF)
    								{
    								  case "05:30": 
    									  Action1.start();
    									  Action2.interrupt();
    								    break;
    								  case "11:30":
    									  Action2.start();
    									  Action1.interrupt();
    								    break;
    								  case "14:00":
    									  Action1.start();
    									  Action2.interrupt();
    								    break;
    								  case "16:30":
    									  Action2.start();
    									  Action1.interrupt();
    								    break;
    								  case "19:00":
    									  Action1.start();
    									  Action2.interrupt();
    								    break;
    								  case "21:45":
    									  Action1();
    								    break;
     
    								  default:
    									  ActionDefaut.start();
    								}
    				}	
    		    }

  7. #7
    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
    Citation Envoyé par spritrl Voir le message
    Oui, le but est d’effectuer une action particulière à intervalle régulier.
    Oui, les actions tournent en boucle
    Ceci est contradictoire : soit une action s'exécute à intervalle régulier, soit elle tourne en boucle.

    Oui, le but est d’effectuer une action particulière à intervalle régulier.
    Citation Envoyé par spritrl Voir le message
    Oui, les actions tournent en boucle jusqu'à ce qu'on change indic
    Ce serait donc plus simple d'utiliser un type d'action qu'un int/Integer. En tout cas, plus direct.

    Pour faire l'action, on va utiliser l'interface Runnable (pour le principe, ce sera peut-être à adapter si ton action est paramétrée).

    En supposant que l'action s'exécute à intervalle régulier, on pourrait utiliser un java.util.Timer, qui permet d'exécuter une tâche toutes les n millisecondes.

    Pour gérer la tâche à exécuter, on va faire une classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class ActionTimerTask extends TimerTask {
     
    		private volatile Runnable runnable;
     
    		public void setAction(Runnable runnable) {
    			this.runnable=runnable;
    		}
     
    		@Override
    		public void run() {
    			if ( runnable!=null ) runnable.run();
    		}
     
    	}
    Pour créer le timer et exécuter la tâche, au début de la méthode main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ActionTimerTask task = new ActionTimerTask();
     
    Timer timer = new Timer();
    timer.schedule(task, 1000); // exécution toutes les 1 secondes (à adapter)
    Donc en changeant la map comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	private static final Map<LocalTime,Runnable> PLANNING_ACTIONS = createPlanning();
    Et pour enregistrer l'action pour une date :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    actions.put(LocalTime.of(5, 30), ()-> {
       // ici le code de l'action
       // par exemple :
       System.out.println("Action 5:30");
    });
    Il faut modifier la/les méthode/s :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public static Runnable getAction(LocalTime time) {
    		return PLANNING_ACTIONS.get(time);
    	}
    Ensuite, il ne te restera plus qu'à faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    task.setAction( getAction(date) );
    Et l'action exécutée toutes les secondes changera.
    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.

Discussions similaires

  1. Besoin de votre aide
    Par BiM dans le forum Contribuez
    Réponses: 33
    Dernier message: 24/03/2008, 17h51
  2. besoin de votre aide
    Par ricomix dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 04/06/2006, 22h46
  3. J'ai besoin de votre aide pour une requête
    Par ovdz dans le forum Langage SQL
    Réponses: 6
    Dernier message: 20/05/2005, 11h42

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