Exécuter un thread dans un autre

cs_jacoco Messages postés 9 Date d'inscription jeudi 22 mai 2003 Statut Membre Dernière intervention 30 avril 2004 - 30 avril 2004 à 10:33
dmaillet Messages postés 500 Date d'inscription mercredi 20 août 2003 Statut Membre Dernière intervention 11 juillet 2007 - 30 avril 2004 à 14:55
je lance un thread dans lequel je demande une saisie utilisateur et à la suite de la saisie utilisateur je veux envoyer le texte saisie dans un deuxieme thread afin de communiquer avec le serveur.
Le problème est qu'à l'éxécution du premier thread le deuxième s'éxécute automatiquement.
Je n'arrive pas à utiliser correctement le wait() et notify()
tchao
@++

3 réponses

dmaillet Messages postés 500 Date d'inscription mercredi 20 août 2003 Statut Membre Dernière intervention 11 juillet 2007
30 avril 2004 à 11:12
arf!
la seule solution pour toi est de lte documente un peu sur les threads pour mieux les comprendre...
je sais c certainement pas la reponse que tu souhaites, mais c essentiel!
sinon, post ton code, on verra d'ou vient le souci...
0
cs_jacoco Messages postés 9 Date d'inscription jeudi 22 mai 2003 Statut Membre Dernière intervention 30 avril 2004
30 avril 2004 à 14:14
Oui je cherche le bon exemple qui permet de traiter le mien.
En fait j'essaye de faire un serveur de jeu en réseau.
Et pour le client j'emploi le code suivant:
import java.io.*;
import java.lang.*;
import java.net.*;

import java.util.StringTokenizer;

import LectureClavier.*;
import Graphique.*;

class TCPClient{
public static int pass;

  private Socket _clientSocket=null;
  private Envoi e;

  public TCPClient(String adress,int port){

    try
    {
     _clientSocket = new Socket(adress, port);
     
     e=new Envoi(_clientSocket);
     
    }
    catch(IOException ex)
    {
    }

  }
  
  public Envoi get_e()
  {
  	return e;
  }
  
  public Socket get_socket()
  {
   return _clientSocket;
  }

  public static void main(String argv[]) throws Exception {
    String sentence=null;
    String modifiedSentence;
    TCPClient tcpclient=new TCPClient("localhost",6789);

    Reception recpmess = new Reception(tcpclient.get_socket(),tcpclient);
    
    BufferedReader inFromUser =
        new BufferedReader(new InputStreamReader(System.in));

    DataOutputStream outToServer =
        new DataOutputStream(tcpclient.get_socket().getOutputStream());

    BufferedReader inFromServer =
        new BufferedReader(new InputStreamReader(tcpclient.get_socket().getInputStream()));

         if(tcpclient.get_socket().isConnected())
            {
                outToServer.writeBytes("/getwelcomessage "+"\n");               
}

    do {
        sentence = inFromUser.readLine();
        outToServer.writeBytes(sentence + '\n');
    }
    while (sentence.compareTo("bye") != 0);

    tcpclient.get_socket().close();

  }

}

class Reception
    extends Thread {
  public Socket _clientSocket;
  public TCPClient _tcpc;
  
  public Reception(Socket clientSocket,TCPClient tc) {
    _clientSocket = clientSocket;
    _tcpc=tc;
    this.start();
  }
 
  public void run() {

    try {
    
    	String r="";
    
      BufferedReader inFromServer =
          new BufferedReader(new InputStreamReader(_clientSocket.getInputStream()));
      String sentence;
      do {

        sentence = inFromServer.readLine();
                

if (sentence.compareTo("/welcomemessage Bienvenue ")==0)
{

_tcpc.get_e().start();

System.out.println("thread Envoi en action "+_tcpc.get_e().isAlive());
}

      }
      while (sentence.compareTo("bye") != 0);

System.out.println(sentence);

    }
    catch (IOException ioe) {
      System.out.println("Acceptance Error: " + ioe);
    }

  }
}

class Envoi extends Thread{

BufferedReader inFromUser;
DataOutputStream outToServer;
String sentence=null;

public Envoi(Socket so)
{
try{
inFromUser =
        new BufferedReader(new InputStreamReader(System.in));

outToServer =
        new DataOutputStream(so.getOutputStream());
    	}
    	catch(IOException ioe){
    	}
    
    
}
 public void run() {
 
 			try{
 

Fenetrebienvenue fb =new Fenetrebienvenue();
String r1=null;
String r ;

do{
r1 = fb.get_texteTape();

sentence="/creermembre "+r1+"\n";
 
 				System.out.println(sentence);
 
 				StringTokenizer st = new StringTokenizer(sentence,":",false);
                r = st.nextToken();

System.out.println("token "+r);

System.out.println("comp token "+r.equals("/creermembre null")); 

if(r.equals("/creermembre null")==true)
 				{try{
 					this.wait();
 				}
 				catch(InterruptedException ie){}
 				}
 				else
 				this.notify();
 
 			}while(r.equals("/creermembre null")==false);
 
 
 
 				outToServer.writeBytes(sentence);
 
 
 			}
catch(IOException ioe){
    		}

}

public String  get_sentence()
{
return sentence;
}

}


Voila mon code, il est un peu brouillon. Mais là vraimement je sèche. je n'arrive à faire attendre la saisie de l'identification par le thread général
0
dmaillet Messages postés 500 Date d'inscription mercredi 20 août 2003 Statut Membre Dernière intervention 11 juillet 2007
30 avril 2004 à 14:55
bon, j'ai pas lu ton code parce que j'ai pas trop le temps,
mais l'ideal je pense pour ce que tu veux faire c'est de synchroniser ces deux thread, l'un recupere un boolean de continue quand l'autre a fini sa tache...

regarde l'exemple ci joint, c'est une ch'tite classe maison pour faire une progressBar synchroniser avec un autre thread....
tu cree un thread en dehors, qui envoi un index de progression:
si le prochain index du thread est dispo, il avance, et idem pour la progress...

c'est simple pour toi, des que ta saisie est bonne, tu lui dis qu'il est dispo, et l''autre repart... tu elnleves les

///////////////////////////////////////////////////////////////////////////////
/**
* intern class of index
*/
private class ProgressIndex {

private int index;
private boolean available = false;

/**
* get the index for threads
* @return index
*/
public synchronized int getIndex() {
while (available == false) {
try {
wait();
}
catch (InterruptedException e) {}
}
available = false;
notifyAll();
return index;
}

/**
* set the index for threads
* @param index
*/
public synchronized void setIndex(int index) {
while (available == true) {
try {
wait();
}
catch (InterruptedException e) {}
}
this.index = index;
available = true;
notifyAll();
}

}
0
Rejoignez-nous