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

Concurrence et multi-thread Java Discussion :

synchronisation Thread main avec sous thread


Sujet :

Concurrence et multi-thread Java

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 253
    Par défaut synchronisation Thread main avec sous thread
    hi,
    comment synchroniser un thread main avec un sous thread?
    mon problème est le suivent, j'exécute un processe runtime à l'intérieur du thread main, sauf que quand je met mon programme marche, j'ai conclus alors que c'est mon thread principal qui n'attend pas le fin de l'exécution de mon thread fils.


    merci pour votre aide

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 096
    Par défaut
    thread_fils.join() dans le père et il attendra que le fils ait terminé son travail.

    Mais bon sans code .... on va avoir dut mal à t'aider
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 253
    Par défaut
    merci pour ta réponse , voici la méthode que j'espère synchroniser avec mon thred main
    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
     
    public  void ExecuteScript2() {
     
          String[] cmd = { "script/bin/sh.exe", "script/script.sh" };
          System.out.println("je suis "+Thread.currentThread().getName());
     
            try {
                Process p = Runtime.getRuntime().exec(cmd);
             Thread.sleep(10000);
     
                BufferedReader reader = new BufferedReader(new InputStreamReader(p.getErrorStream()));
    			String line = "";
     
     
                try {
    				while((line = reader.readLine()) != null) {
    		// Traitement du flux d'erreur de l'application si besoin est
                              System.out.println(line);
     
    				}
    			} finally {
    				reader.close();
    			}
     
     
            } catch (Exception e) {
                e.printStackTrace();
            }}

    en fait mon thread fils est processe runtime, il ne reconnais pas la methode join.
    le resultat de mon System.out.println("je suis "+Thread.currentThread().getName()); est "main", donc j'ai conclus que c'est la main qui se termine avant le process.

    merci

  4. #4
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 096
    Par défaut
    Alors tu dois utiliser (ou p est de type Process) pour attendre la fin du processus.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 253
    Par défaut
    j'ai déjà testé waitFor(), mais j'ai remarqué que le processe y reste bloqué infiniment, il ne sort plus jamais du waitfor().
    j'ai fait même le test en mode pas à pas, et il reste bien bloqué dedans.

  6. #6
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 096
    Par défaut
    Bon deja ton Thread.sleep(); il faut pas l'utiliser puisque waitFor() fera cela sa place. (Detail inutile).

    Ensuite s'il reste bloqué sur le waitFor c'est que ton script.sh ne se termine pas à mon avis donc forcement il reste au waitFor ...

    Pour avoir deja utilisé à plusieur reprise Process et waitFor, je peux te dire que cela fonctionne en general parfaitement.

    Sinon voici un truc qui devrait marcher

    Fichier go.bat:

    Class 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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    public class Snippet
    {
    	public static void main(String[] args)
    	{
    		System.out.println("je suis " + Thread.currentThread().getName());
     
    		try
    		{
    			final Process p = Runtime.getRuntime().exec("go.bat");
     
    			// Consommation de la sortie standard de l'application externe dans un Thread separe
    			new Thread() {
    				public void run() {
    					try {
    						BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
    						String line = "";
    						try {
    							while((line = reader.readLine()) != null) {
    								System.out.println("OUT:"+line);
    							}
    						} finally {
    							reader.close();
    						}
    					} catch(IOException ioe) {
    						ioe.printStackTrace();
    					}
    				}
    			}.start();
     
    			// Consommation de la sortie d'erreur de l'application externe dans un Thread separe
    			new Thread() {
    				public void run() {
    					try {
    						BufferedReader reader = new BufferedReader(new InputStreamReader(p.getErrorStream()));
    						String line = "";
    						try {
    							while((line = reader.readLine()) != null) {
    								System.out.println("ERR:"+line);
    							}
    						} finally {
    							reader.close();
    						}
    					} catch(IOException ioe) {
    						ioe.printStackTrace();
    					}
    				}
    			}.start();
     
    			System.err.println("Waiting");
    			p.waitFor();
    			System.err.println("Fini");
     
    		} catch (Exception e)
    		{
    			e.printStackTrace();
    		}
     
    	}
     
     
     
    }
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,



    Il y a plusieurs sujets sur le problème : il faut traiter toutes les entrée/sorties, depuis des threads différents afin d'éviter les interblocages !




    a++

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 253
    Par défaut
    d'accord mais le script quand je l'exécute directement à partir d'une invité de commande il marche correctement, par contre je ne sais pas si le shell.sh rste bloquer, sachant que en regardant le gestionnaire de tâche de Windows j'ai vu que mon sell.exe s'exécute bien mais il reste ouvert donc j'ai utilisé la fonction destroy() pour le détruire mais mon problème n'est pas résolu.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Process p = Runtime.getRuntime().exec(cmd);
             Thread.sleep(10000);
             //Thread.sleep(p.waitFor());
                p.destroy();
    Cordialement

  9. #9
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    il faut traiter toutes les entrée/sorties, depuis des threads différents afin d'éviter les interblocages !
    Dans ton dernier exemple de code tu ne traites aucun flux d'E/S !

    a++

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 253
    Par défaut
    Dans ton dernier exemple de code tu ne traites aucun flux d'E/S !
    je ne suis pas sure de savoir comment faire, oui je sais je suis débutant , mais bon voila ce que j'ai fait
    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
     
                Process p = Runtime.getRuntime().exec(cmd);
             Thread.sleep(10000);
             //Thread.sleep(p.waitFor());
                p.destroy();
     
                p.getOutputStream().close();
                p.getInputStream().close();
                BufferedReader reader = new BufferedReader(new InputStreamReader(p.getErrorStream()));
    			String line = "";
     
     
                try {
    				while((line = reader.readLine()) != null) {
    					// Traitement du flux d'erreur de l'application si besoin est
                              System.out.println(line);
                             // Thread.sleep(500);
    				}
    			} finally {
    				reader.close();
    			}
     
     
            } catch (Exception e) {
                e.printStackTrace();
            }}
    mais ça ne marche toujours pas!!

  11. #11
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 096
    Par défaut
    Tu n'as meme pas regardé le code que j'ai posté au dessus il me semble. Il contenait pourtant une bonne piste plutot que gue ton dernier code que je vois ici
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 253
    Par défaut
    écoute wax78, merci bcp ton code marche parfaitement, j'ai juste changé ton bat par mon shell et ça marché, merci bcp, merci vous tous.

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 253
    Par défaut
    mon problème de conflit des threads est résolu, cependant je souhaiterai vous poser une nouvelle question .

    j'ai utilisé un timertask pour exécuter ma classe précédente systématiquement, jusqu'à la tout va bien, maintenant je souhaite développer une petite interface qui permet de lancer ou d'interrompre manuellement l'exécution de mon script.
    ma question est: connaissez vous une commande qui arrête complètement l'exécution de mon script, donc qui arrête tous les threads.
    sachant que moi quand j'exécute ma classe et j'observe les processus déclenché par cette exécution, je vois: sh.exe, scp.exe, rsync.exe, mais dés que j'arrête l'exécution de ma classe (de mon thread), tout ces processus se ferment automatiquement.
    je ne sais pas si vous avez compris ma question, je sais j'ai du mal avec le français, mais en gros ma question est comment je dois faire pour donner à l'utilisateur la possibilité d'arrêté le thread via une interface swing par exemple.
    merci

  14. #14
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 096
    Par défaut
    Noprob, je n'avais meme pas fais attention que tu n'etais pas francophone

    Quand tu parles de thread, tu parles de ton Process qui lance ton script ?
    Si non peux tu paster tout le code ? car j'ai dut mal à comprendre tout.

    Sinon tu px faire un process.destroy() (je pense). Et interrompre ton thread (si c'est lui qui lance la process) avec interrupt() (ou une methode plus propre mais si ton thread est en attente du process forcement tu n'as que interrupt() possible). Mais je me trompe peut etre.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 253
    Par défaut
    ok je met le code à disposition, et pour expliquer le problème, mon objectif est de faire un petit programme qui s'exécute en fond d'écran, qui fait chaque jours par exemple un backup à 00H00, c'est pourquoi j'ai utilisé timertask pour rendre l'exécution systématique, maintenant je veux faire deux choses, la première c'est de pouvoir arrêter l'exécution en appuyant par exemple sur un bouton "stop" ET la deuxième c'est de rendre mon interface exécutable en fond d'écran et faire tourner son icône en bas à droite à coté de l'horloge comme skype ou msn.
    voila si quelqu'un a des idée ou de pistes je suis prenant voila la classe complet
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    public  void ExecuteScript2()
    	{
    		System.out.println("je suis " + Thread.currentThread().getName());
             String[] cmd = { "script/bin/sh.exe", "script/script.sh" };
          //System.out.println("je suis "+Thread.currentThread().getName());
     
    		try
    		{
    //			 final Process p = Runtime.getRuntime().exec("script/go.bat");
                 final Process p = Runtime.getRuntime().exec(cmd);
     
    			// Consommation de la sortie standard de l'application externe dans un Thread separe
    			new Thread() {
    				public void run() {
    					try {
    						BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
    						String line = "";
    						try {
                                try {
                                    while ((line = reader.readLine()) != null) {
                                        System.out.println("OUT:" + line);
                                    }
                                } catch (IOException ex) {
                                    Logger.getLogger(Snippet.class.getName()).log(Level.SEVERE, null, ex);
                                }
    						} finally {
    							reader.close();
    						}
    					} catch(IOException ioe) {
    						ioe.printStackTrace();
    					}
    				}
    			}.start();
     
    			// Consommation de la sortie d'erreur de l'application externe dans un Thread separe
    			new Thread() {
    				public void run() {
    					try {
    						BufferedReader reader = new BufferedReader(new InputStreamReader(p.getErrorStream()));
    						String line = "";
    						try {
    							while((line = reader.readLine()) != null) {
    								System.out.println("ERR:"+line);
    							}
    						} finally {
    							reader.close();
    						}
    					} catch(IOException ioe) {
    						ioe.printStackTrace();
    					}
    				}
    			}.start();
     
    			System.err.println("Waiting");
    			p.waitFor();
    			System.err.println("Fini");
     
    		} catch (Exception e)
    		{
    			e.printStackTrace();
    		}
     
    	}
     
         public void ExecuteTachFond(){
         int DAY_LENGTH = 1000 * 60 * 60 * 24;
         DAY_LENGTH = 20000;
     
            Date now = new GregorianCalendar(Locale.getDefault()).getTime();
            Date tomorrow = new Date((now.getTime()/DAY_LENGTH + 1) * DAY_LENGTH);
            Timer tempsTimer = new Timer("Planificateur", false);
           // final ExecuteScript toto = new ExecuteScript();
            TimerTask timerTache = new TimerTask() {
                public void run() {
                    System.out.println("Lancement");
                    //System.out.println();
                    ExecuteScript2();
     
                }
            };
     
     
            tempsTimer.schedule(timerTache, now, DAY_LENGTH);
     
        }
     
     
        public static void main(String[] args) {
    Snippet e =new Snippet();
    e.ExecuteTachFond();
       // e.ExecuteScript2();
     
    }
     
    }

  16. #16
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 096
    Par défaut
    Ok je pense que j'ai compris ce que tu voulais.

    J'ai donc recoder un truc vite fait pour t'aider. J'ai supprimer la partie timer task, il suffit que tu t'imagines avoir un bouton Start et Stop (ca fait la meme chose)...

    Le programme principal :

    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
    public class Snippet
    {
    	Thread_Action ta;
     
    	public void ExecuteTachFond()
    	{
    		System.out.println("Lancement");
    		// System.out.println();
    		if (ta!=null)
    		{
    			ta.interrupt();
    		}
    		ta = new Thread_Action();
    		ta.start();
    	}
     
    	public boolean isExecution()
    	{
    		if (ta!=null)
    			if (ta.isAlive()==true)
    				return true;
    		return false;
    	}
     
    	private void stop()
    	{
    		ta.interrupt();
    	}
     
     
    	public static void main(String[] args) throws InterruptedException
    	{
    		Snippet e = new Snippet();
    		e.ExecuteTachFond();
     
    		System.err.println("J'attends un peu que l'user se decide a annuler");
    		Thread.sleep(2500); // On image que le gaillards attends 2 seconde avant de faire Cancel.
    		e.stop();
     
    	}
     
    }
    La thread qui execute ton travail:

    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    public class Thread_Action extends Thread
    {
     
    	Process p ;
    	Thread t_out;
    	Thread t_err;
     
    	public void run()
    	{
    		System.out.println("je suis " + Thread.currentThread().getName());
    	//	String[] cmd = { "script/bin/sh.exe", "script/script.sh" };
     
    		String[] cmd = { "go.bat" };
     
    		try
    		{
    			// final Process p = Runtime.getRuntime().exec("script/go.bat");
    			p = Runtime.getRuntime().exec(cmd);
     
    			// Consommation de la sortie standard de l'application externe dans 2 Thread separe
    			t_out = creeThreadFluxLecture(p.getInputStream());
    			t_out.start();
    			t_err = creeThreadFluxLecture(p.getErrorStream());
    			t_err.start();
     
    			System.err.println("Waiting");
    			try
    			{
    			p.waitFor();
    			}
    			catch(InterruptedException e)
    			{
    				System.err.println("L'user a demander d'annuler");
    			}
     
    			System.err.println("Fini");
     
    		} 
    		catch (Exception e)
    		{
    			e.printStackTrace();
    		}
     
    	}
     
    	public void interrupt()
    	{
     
    		t_out.interrupt();
    		t_err.interrupt();
    		p.destroy();
    		/*try
    		{
    			p.waitFor();
    		} 
    		catch (InterruptedException e)
    		{
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}*/
    		super.interrupt();
    	}
     
    	private Thread creeThreadFluxLecture(final InputStream inputStream)
    	{
    		Thread t = new Thread()
    		{
    			public void run()
    			{
    				try
    				{
    					BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
    					String line = "";
    					try
    					{
    						try
    						{
    							while ((line = reader.readLine()) != null)
    							{
    								System.out.println("OUT:" + line);
    							}
    						} catch (IOException ex)
    						{
    							// Logger.getLogger(Snippet.class.getName()).log(Level.SEVERE,
    							// null, ex);
    						}
    					} finally
    					{
    						reader.close();
    					}
    				} catch (IOException ioe)
    				{
    					ioe.printStackTrace();
    				}
    			}
    		};
    		return t;
    	}
    }
    Il y'a peut etre des choses horrible qu'il ne faut pas faire, mais je pense que cela fonctionnera dans l'ensemble.

    Comme tu px le voir dans le main, la tache s'execute en fond, et tu px demander une annulation si necessaire (ici apres 2,5 secondes).

    Je pense que c'est a ca que tu voudrais arriver non ?

    Une fois le principe compris, tu pourras faire un GUI et ensuite t'arranger pour avoir le truc dans le systray.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 253
    Par défaut
    oui super, c'est exactement ce que je voulais, merci beaucoup.

    dans ton dernier message tu as parlé de systray
    Une fois le principe compris, tu pourras faire un GUI et ensuite t'arranger pour avoir le truc dans le systray.
    je me suis renseigné sur le sujet, et j'ai vu que ça sert à placer une icône dans le system tray du bureau, mais je n'ai pas bien compris le principe! est ce que je dois utilisé un logiciel qui va placer mon programme dans le systray ou je dois coder moi même à la main un classe qui s'occupe de cela.

    merci

  18. #18
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 096
    Par défaut
    Non tu ne dois rien utiliser si tu as java 1.6.

    jette un oeil ici : http://java.sun.com/developer/techni...e6/systemtray/

    Je l'ai deja fait pour un programme, c'est tres facile.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  19. #19
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 253
    Par défaut
    wax78 merci pour ton aide.
    j'ai fait une petite interface avec deux boutons satrt et exit.
    dans start j'exécute le thred du script et dans exit j'arrête son exécution.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     public void actionPerformed(ActionEvent e) {
            Snippet s = new Snippet();
            if(e.getSource()==btnSynchronisation)
            {
     
                s.ExecuteTachFond();
            }
            else if (e.getSource() == btnStopSynchronisation)
            {
                //Snippet s = new Snippet();
                s.stop();
            }
        }
    jusqu'à la tout va bien mais quand j'exécute mon jFram, j'ai l'erreur suivant:
    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
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
            at ThreadGUI.Snippet.stop(Snippet.java:38)
            at Interface.AccueilRsync1.actionPerformed(AccueilRsync1.java:260)
            at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1849)
            at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2169)
            at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)
            at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)
            at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
            at java.awt.Component.processMouseEvent(Component.java:5517)
            at javax.swing.JComponent.processMouseEvent(JComponent.java:3135)
            at java.awt.Component.processEvent(Component.java:5282)
            at java.awt.Container.processEvent(Container.java:1966)
            at java.awt.Component.dispatchEventImpl(Component.java:3984)
            at java.awt.Container.dispatchEventImpl(Container.java:2024)
            at java.awt.Component.dispatchEvent(Component.java:3819)
            at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212)
            at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3892)
            at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)
            at java.awt.Container.dispatchEventImpl(Container.java:2010)
            at java.awt.Window.dispatchEventImpl(Window.java:1791)
            at java.awt.Component.dispatchEvent(Component.java:3819)
            at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
            at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
            at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
            at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
            at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
            at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
    et le pire qu'il continue à exécuter le script.
    pouvez vous m'aider?

  20. #20
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 096
    Par défaut
    Mets Snippet en dehors de ton actionPerformed a mon avis pour commencer.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. java.lang.NoSuchMethodError: main Exception in thread "main"
    Par rosyfulla dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 26/09/2014, 20h05
  2. Réponses: 3
    Dernier message: 31/07/2012, 02h42
  3. Réponses: 4
    Dernier message: 18/10/2009, 18h36
  4. prb avec un thread sous linux
    Par kikoufr dans le forum POSIX
    Réponses: 5
    Dernier message: 02/09/2006, 19h55
  5. Thread probs avec WaitFor()
    Par pixelrock dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/11/2002, 09h40

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