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 :

[thread]attendre la fin d'un thread?....


Sujet :

Concurrence et multi-thread Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2005
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 86
    Points : 35
    Points
    35
    Par défaut [thread]attendre la fin d'un thread?....
    Voilà, je lance un procédure dans un thread et donc en même temps, la procédure suivante se lance également (mais pas dans un thread). comment dois je faire pour attendre que finisse le thread avant de continuer le déroulement du programme (donc attendre la fin du thread juste après que la procédure suivant le thread est terminée)...je vais résumer... :

    premiere procédure --> se lance dans un thread
    procédure suivante --> se déroule sans être dans un thread
    mise en attente pour attendre la fin du déroulement du thread
    3ème procédure --> prend en compte les résultats lancé dans le thread

    J'espère que vous avez compris

  2. #2
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Il suffit de regarder la doc de la classe Thread, tu y aurais trouvé les méthodes join()...

    a++

  3. #3
    Membre expérimenté
    Avatar de fabszn
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2002
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2002
    Messages : 974
    Points : 1 638
    Points
    1 638
    Par défaut
    Hello,

    N'oublie pas les rêgles de savoir vivre et de politesse babarpapa....Bonjour, s'il vous plait, merci .. au revoir!!

    C'est toujours plus agréable à lire et ca donne envie de t'aider!
    @+

    Fabszn
    Twitter : @fsznajderman

    N'oubliez pas le bouton
    Comment bien poser ses questions sur le forum


  4. #4
    Nouveau membre du Club
    Inscrit en
    Mai 2005
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 86
    Points : 35
    Points
    35
    Par défaut
    Citation Envoyé par fabszn
    Hello,

    N'oublie pas les rêgles de savoir vivre et de politesse babarpapa....Bonjour, s'il vous plait, merci .. au revoir!!

    C'est toujours plus agréable à lire et ca donne envie de t'aider!
    désolé, c'est parce que j'ai deja posté tout à l'heure où j'ai dit bonjour, merci, aurevoir, bonne journée, et la famille, ça va?
    Je plaisante....désolé

  5. #5
    Nouveau membre du Club
    Inscrit en
    Mai 2005
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 86
    Points : 35
    Points
    35
    Par défaut
    bonjour
    le join() a l'air de fonctionner, par contre, la procédure qui se déroule en même temps que le thread ne s'effectue pas bien.... je vous explique... mon programme est un plugin d'imageJ. et il doit en même temps lancer une DLL codé en C (utilisation de JNI) qui travaille sur une image et afficher cette image grâce au fonction d'imageJ. En gros, je lance la dll avec le Thread et l'affichage de mon image doit se faire pendant que le thread se déroule, ensuite, il faut que j'attende la fin du traitement (thread) avant de continuer mon programme. le problème, c'est que je lance le thread, l'affichage commence à se faire mais ça reste bloqué jusqu'à que le thread soit terminé... Vu que le travaille de la dll prend beacoup de ressource, j'ai pensé que le mauvais affichage venez de là, mais c'est pas ça, car si je ne met pas la fonction join() après l'affichage, l'image s'affichage très bien et le programme continu pendant que la dll tourne. j'ai aussi testé les priorité de thread en mettant bas, mais ça ne change rien, auriez vous un conseil svp? En vous remerciant.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par babarpapa
    En vous remerciant.

    regarde ici tu auras tous ce qu'il te faut
    http://javaalmanac.com/egs/java.lang/BasicThread.html

  7. #7
    Nouveau membre du Club
    Inscrit en
    Mai 2005
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 86
    Points : 35
    Points
    35
    Par défaut
    j'avais bien fait ce qui est écrit sur la page que tu m'as donné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        // Wait indefinitely for the thread to finish
        try {
            thread.join();
            // Finished
        } catch (InterruptedException e) {
            // Thread was interrupted
        }
    mais le problème est toujours le même

  8. #8
    Invité
    Invité(e)
    Par défaut
    il vaut mieux poster ton code ici

  9. #9
    Nouveau membre du Club
    Inscrit en
    Mai 2005
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 86
    Points : 35
    Points
    35
    Par défaut
    ok, alors je rapelle que c'est un plugin pour imageJ, donc pas executable comme ça :
    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
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
     
    import ij.*;
    import ij.gui.*;
    import ij.process.*;
    import ij.io.*;
    import ij.io.FileSaver;
    import java.io.*;
    import java.awt.* ;
    import java.awt.image.*;
    import javax.swing.* ;
    import java.awt.event.*;
    import ij.plugin.*;
    import ij.plugin.PlugIn;
    import java.util.regex.* ;
     
    public class stk_image_ implements PlugIn
    {
           public void run(String str)
           {
          	      Runtime.getRuntime().gc();
                  JFrame fen = new MaFenetre() ;
                  fen.setVisible(true) ;
           }
    }
    //class qui charge la dll C
    class Main
    {
           static {System.loadLibrary("Analyse");}
           public static native int Tifftranslate(String j);
    }
     
    class MaFenetre extends JFrame
    {
    	private JMenuBar barreMenus ;
    	private JMenu fichier ;
    	private JMenuItem ouvrir,fermer,ouvrirs;
    	public MaFenetre ()
    	{
    	       setTitle("Image stack Plugin!") ;
    	       setBounds(10,40,250,200) ;
    	       barreMenus = new JMenuBar() ;
    	       setJMenuBar(barreMenus) ;
    	       fichier = new JMenu("Fichier") ;
    	       barreMenus.add(fichier) ;
    	       ouvrir = new JMenuItem("Charger un fichier .stk") ;
    	       fichier.add(ouvrir) ;
    	       ouvrirs = new JMenuItem("Charger un répertoire (*.stk)") ;
    	       fichier.add(ouvrirs) ;
    	       fermer = new JMenuItem("Quitter") ;
    	       fichier.add(fermer) ;
               ouvrir.addActionListener(new ArborescenceFichier());
               ouvrirs.addActionListener(new ArborescenceDossier());
               fermer.addActionListener(new QuitterProg());
    	}
    }
     
     
    class ArborescenceFichier implements ActionListener 
    {
        public void actionPerformed(ActionEvent e)
        {
    		JFileChooser filechoose = new JFileChooser();
    		filechoose.setCurrentDirectory(new File("."));
    		String approve = new String("Ouvrir");
            String monfichier= null;
    		int resultatEnregistrer = filechoose.showDialog(filechoose,approve);
    		if (resultatEnregistrer == JFileChooser.APPROVE_OPTION)
    			monfichier = filechoose.getSelectedFile().toString();
    		Thread thr1 = new ThreadImage("Image",monfichier);//premier thread qui affiche l'image
    		Thread thr2 = new ThreadCommunicationC("Communication",monfichier);//2eme thread qui lance la dll
     
    		thr1.start();
            try{
            	thr1.join();
            	} 
            catch (InterruptedException err) 
            	{
            		IJ.showMessage("erreur!!");
            		return;
            	}
     
    		thr2.start();
            try{
            	thr2.join();
            	} 
            catch (InterruptedException err) 
            	{
            		IJ.showMessage("erreur!!");
            		return;
            	}//on attend que le thread est terminé pour continuer le prog
        	Pattern p=Pattern.compile("\\.");
        	String[] items = p.split(monfichier);
        	String result=null;
        	if (monfichier.indexOf(".stk")!=-1)
        		result=items[0]+".rect.stk";
        	else if (monfichier.indexOf(".STK")!=-1)
        		result=items[0]+".rect.STK";
        	else IJ.showMessage("problème d'ouverture de fichier de sortie");
        	IJ.open(result);
        }
    }
     
    class ThreadImage extends Thread
    {
    	private String threadName;
    	private String path;
    	public ThreadImage(String threadName,String path) 
    	{
            this.threadName = threadName;
            this.path=path;
        }
    	public void run() 
    	{
    		IJ.open(path);
    	}
    } 
    class ThreadCommunicationC extends Thread
    {
    	private String threadName;
    	private String path;
    	public ThreadCommunicationC(String threadName,String path) 
    	{
            this.threadName = threadName;
            this.path=path;
        }
    	public void run() 
    	{
    		//Splash s = new Splash();
        	Main communicationc=new Main();
        	communicationc.Tifftranslate(path);
    	}
    }
    class ArborescenceDossier implements ActionListener 
    {
        public void actionPerformed(ActionEvent e) 
        {
    		File mondossier= null;
    		int j=0;
    		String[] list=null;
    		String[] fichierstk=null;
    		JFileChooser filechoose = new JFileChooser();
    		filechoose.setCurrentDirectory(new File("."));
    		filechoose.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY );
    		String approve = new String("Charger");
    		int resultatEnregistrer = filechoose.showDialog(filechoose,approve); 
    		if (resultatEnregistrer == JFileChooser.APPROVE_OPTION) 
    			mondossier = filechoose.getSelectedFile();
    		list = mondossier.list();
    		for(int i = 0; i < list.length; i++)
    			if (list[i].endsWith(".sh"))
    			{
    				fichierstk[j]=list[i];
    				j++;
    			}
        }
    }
    class QuitterProg implements ActionListener 
    {
          public void actionPerformed(ActionEvent e)
          {
        	     System.exit(0);
          }
    }

  10. #10
    Nouveau membre du Club
    Inscrit en
    Mai 2005
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 86
    Points : 35
    Points
    35
    Par défaut
    En fait, le code serait même ça (je vous mais que le code ou est appelé le thread) :
    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
     
    class ArborescenceFichier implements ActionListener 
    {
        public void actionPerformed(ActionEvent e)
        {
    		JFileChooser filechoose = new JFileChooser();
    		filechoose.setCurrentDirectory(new File("."));
    		String approve = new String("Ouvrir");
            String monfichier= null;
    		int resultatEnregistrer = filechoose.showDialog(filechoose,approve);
    		if (resultatEnregistrer == JFileChooser.APPROVE_OPTION)
    			monfichier = filechoose.getSelectedFile().toString();
    Thread thr2 = new ThreadCommunicationC("Communication",monfichier);
    		thr2.start();//lancement du thread
    		IJ.open(monfichier);//ouverture de l'image
    		try
    		{
    			thr2.join();//attente de la fin du thread pour continuer
    		}
    		catch (InterruptedException err) 
    		{
    			IJ.showMessage("erreur!!");
    		}
       	Pattern p=Pattern.compile("\\.");
        	String[] items = p.split(monfichier);
        	String result=null;
        	if (monfichier.indexOf(".stk")!=-1)
        		result=items[0]+".rect.stk";
        	else if (monfichier.indexOf(".STK")!=-1)
        		result=items[0]+".rect.STK";
        	else IJ.showMessage("problème d'ouverture de fichier de sortie");
        	IJ.open(result);
        }
    }
    class ThreadCommunicationC extends Thread
    {
    	private String threadName;
    	private String path;
    	public ThreadCommunicationC(String threadName,String path) 
    	{
            this.threadName = threadName;
            this.path=path;
        }
    	public void run() 
    	{
        	Main communicationc=new Main();
        	communicationc.Tifftranslate(path);
    	}
    }

    Donc l'ouverture se fait, mais qu'à moitié.... je sais pas à quoi c'est dû.... et l'apel à la dll se fait bien aussi...mais ça bloque tout le programme tout au long de son exécution.... je comprends pas pourquoi ça fait pas son travail de thread... help plz

Discussions similaires

  1. Thread attendre la fin
    Par topolino dans le forum Windows Forms
    Réponses: 7
    Dernier message: 26/04/2011, 12h12
  2. Attendre la fin d'un thread
    Par apmic dans le forum EDT/SwingWorker
    Réponses: 8
    Dernier message: 23/08/2007, 10h04
  3. Attendre la fin d'un thread: Access violation
    Par Booster2ooo dans le forum Delphi
    Réponses: 5
    Dernier message: 15/04/2007, 10h31
  4. [Thread] Attendre la fin ...
    Par phplive dans le forum Langage
    Réponses: 2
    Dernier message: 21/03/2006, 22h29
  5. [Thread] comment attendre la fin d'un thread?
    Par billynirvana dans le forum Concurrence et multi-thread
    Réponses: 11
    Dernier message: 24/08/2005, 10h43

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