Partage
  • Partager sur Facebook
  • Partager sur Twitter

Taches simultanées possible ?

Merci par avance pour votre aide.

    18 mai 2018 à 21:33:26

    Bonjour,

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

    En effet, j'étais sur une bonne lancer pour un petit projet cependant voici mon problèmes : 

    Vous pouvez constater à travers le code ci-dessous une première partie "Planning" qui, à différents moments 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 :

    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 lorsqu'il passera a l'heure suivante.

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

    			// 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 :

    if(indic==1){
    
    // Mon code contenant une boucle
    
    }

    Action numéro 2 :

    if(indic==2){
    
    // Mon code contenant une boucle
    
    }

    Action numéro 3 :

    if(indic==3){
    
    // Mon code contenant une boucle
    
    }

    Si rien ne se passe : 

    if(indic==0){
    
    // Fonction par défaut contenant une boucle
    
    }




    Merci par avance pour votre aide.

    Cordialement.



    -
    Edité par spritrl 20 mai 2018 à 11:17:25

    • Partager sur Facebook
    • Partager sur Twitter
      20 mai 2018 à 8:52:02

      Bonjour,

      Regarde du côté des Threads. Bon courage.

      • Partager sur Facebook
      • Partager sur Twitter
        20 mai 2018 à 9:56:08

        @rtur a écrit:

        Bonjour,

        Regarde du côté des Threads. Bon courage.


        Pensez vous que cela puisse résoudre mon problème car le systeme des Theads a l'air complexe.

        Existe-il une autre alternative ? 

        • Partager sur Facebook
        • Partager sur Twitter
          21 mai 2018 à 14:47:27

          Bonjour,

          spritrl a écrit:

          Pensez vous que cela puisse résoudre mon problème

          Oui sans aucun doute

          spritrl a écrit:

          car le systeme des Theads a l'air complexe

          Il est vrai que certains aspects des Threads sont complexes au premier abord. Néanmoins, on peux utiliser les threads sans en connaître tous les tenants et aboutissant. Je te mets ci-dessous un petit exemple tout simple utilisant des threads. Comme tu peux le voir, les tâches de fonds doivent implémenter l'interface Runnable puis être lancée avec "new Thread(maClass).start();". Rien de bien sorcier en soit.

          import java.awt.Color;
          import java.awt.GridLayout;
          import java.awt.event.ActionEvent;
          
          import javax.swing.AbstractAction;
          import javax.swing.JButton;
          import javax.swing.JFrame;
          import javax.swing.JLabel;
          
          public class Chrono extends JFrame{
          	private static final long serialVersionUID = 1L;
          	private JLabel etiquette;
          	long debut;
          	long temps;
          	
          	/**
          	 * Constructeur de la classe principale
          	 * Met en place un bouton et une étiquette
          	 */
          	public Chrono() {
          			//JFrame
          			setLocationRelativeTo(null);
          			setSize(150, 100);
          			setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          			setLayout(new GridLayout(2, 1));
          			
          			//JLabel
          			etiquette = new JLabel();
          			etiquette.setOpaque(true);
          			getContentPane().add(etiquette);
          			
          			//JButton
          			JButton bouton = new JButton("start");
          			bouton.addActionListener(new AfficheTemps());
          			getContentPane().add(bouton);
          	}
          	
          	/**
          	 * Compte affiche les secondes de 1 à 10s
          	 * Sera exécuté dans un thread
          	 */
          	private class Compte implements Runnable {
          		public void run() {
          			debut = System.currentTimeMillis();
          			while(temps <= 10000) {
          				//Calcule le temps écoulé depuis que le bouton a été pressé
          				temps = System.currentTimeMillis() - debut;
          				
          				//Affiche le temps écoulé dans l'étiquette
          				etiquette.setText(Long.toString(temps/1000));
          			}
          		}
          	}
          	
          	/**
          	 * Colore le fond de l'étiquette en fonction du temps écoulé
          	 * Sera également exécuté dans un thread
          	 */
          	private class Colore implements Runnable{
          		public void run(){
          			while(temps <= 10000) {
          				
          				//le fond de l'étiquette est vert pendant les 5 premières secondes
          				if (temps < 5000) {
          					etiquette.setBackground(Color.GREEN);
          				
          				//Elle se colore en orange entre 5 et 8s
          				}else if(temps >= 5000 && temps < 8000) {
          					etiquette.setBackground(Color.ORANGE);
          				
          				//Puis en rouge entre 8 et 10s
          				}else {
          					etiquette.setBackground(Color.RED);
          					etiquette.setForeground(Color.WHITE);
          				}
          			}
          		}
          	}
          	
          	/**
          	 * Action réalisée lorsque le bouton "start" est pressé
          	 */
          	private class AfficheTemps extends AbstractAction{
          		private static final long serialVersionUID = 1L;		
          		public void actionPerformed(ActionEvent arg0){
          			//Démarre un premier thread pour compter jusqu'a 10s
          			new Thread(new Compte()).start();
          			
          			//Démarre un second thread pour colorer l'étiquette
          			//en fonction du temps écoulé
          			new Thread(new Colore()).start();
          		}
          	}
          	
          	/**
          	 * Point de départ de l'application
          	 */
          	public static void main(String[] args) {
          		new Chrono().setVisible(true);
          	}
          }
          



          spritrl a écrit:

          Existe-il une autre alternative ?

          Tu peux mettre des boucles dans des boucles et prévoir des conditions de sortie de boucle. Attention, le code risque de devenir rapidement illisible et difficile à tester. 

          • Partager sur Facebook
          • Partager sur Twitter

          Taches simultanées possible ?

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown