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

Java ME Discussion :

Problème de Thread


Sujet :

Java ME

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 6
    Par défaut Problème de Thread
    bonjour à tous

    je développe actuellement une application ou je dois lire le contenu d'une page php; jusqu'ici, pas de problème, j'ai testé l'algo de lecture de la page, tout se passe nickel

    par contre, comme je dois d'abord recuperer des données entrées dans un Form, je dois effectuer cette connection dans un thread lancé à part

    le probleme, c'est que dans un thread la methode run() ne permet pas de recuperer un quelconque resultat, alors que j'ai besoin de la valeur de la chaine de caractère lue sur la page php

    j'ai bien essayé d'integrer un thread à l'interieur d'une classe pour recuperer le resultat une fois le thread terminé avec un join()... sans résultat.

    je ne vois pas comment m'en sortir, si vous avez une idée...

    merci d'avance

    ci joint mon code:

    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
     
    public class Interpreter implements Runnable 
    {
    	private String _result;	
    	private Thread _connect;
    	private String _url;
    	int flag;
     
    	public Interpreter(String _address)
    	{
    		_url = _address;
    		_result = new String("non...");
    		//flag = 0;
    	}
     
     
    	public void run() 
    	{ 
    		//flag = 1;
    		StringBuffer _b = new StringBuffer();
    		StreamConnection _sc = null;
    		//HttpConnection _c = null;
    		InputStream _is = null;
    		try
    		{
    			int _ch = 0;
    			_sc = (StreamConnection)Connector.open(_url);
    			_is = _sc.openInputStream();
     
    			while((_ch = _is.read()) != -1)
    			{
    				_b.append((char) _ch);
    			}
    		}
    		catch( Exception e )
            {
                e.printStackTrace();
                _b = new StringBuffer( "error on http connection" );
            }
    		finally
    		{
    			if (_is != null)
    			{
    				try
    				{
    					_is.close();
    				}catch (IOException ioe1){ioe1.printStackTrace();}
    			}
    			if (_sc != null)
    			{
    				try
    				{
    					_sc.close();
    				}catch (IOException ioe2){ioe2.printStackTrace();}
    			}
    		}
    		_result = new String(_b.toString());
     
    	}
     
    	public void readContents() 
            {	
    		_connect = new Thread(this);
    		_connect.start();
    	}
     
    	public String getResult()
    	{
    		/*if (flag == 0)
    			return("no thread");
    		else*/ 
    			return(_result);
    	}
    }
    Ensuite, l'appel dans la classe MIDlet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    _answer = new Interpreter(_url);
    _answer.readContents();
    _contents = _contents.concat(_answer.getResult());

  2. #2
    Membre éclairé Avatar de Vesperal
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 81
    Par défaut
    Et si tu héritait de la classe Thread, au lieu d'implémenter Runnable ?

    Il suffit ensuite de redéfinir la méthode run, en passant un paramètre si tu veux, mais lancant le thread malgrés tout.
    Exemple :


    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
     
     
    public class MonThread extends Thread {
     
    [...]
     
         public void run(String arg1) {        // Un éxemple d'argument possible
     
                super();                   // on appelle le run() de Thread
                System.out.println(arg1);  // ici tu fais ce que tu veux faire avec ta variable
     
         }
    [...]
     
    }
    Ensuite, la seule chose est de faire :


    new MonThread().run(ton_argument);

    plutôt que simplement

    new MonThread();

    Ce qui reviendra au même niveau lancement du Thread, mais te permettra les traitements que tu voulais faire

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 6
    Par défaut
    salut vesperal, merci de ton aide.

    mon problème n'est pas de passer une variable dans mon Thread, car j'instancie cette variable dans le constructeur, et elle est ensuite prise en compte par le thread

    par contre, je n'arrive pas à recupérer le contenu de la variable _result qui normalement devrais etre égale au texte lu sur la page, ce qui n'est pas le cas

    le resultat est toujours le meme: "non..."

    est ce que la methode getResult que j'utilise pour recuperer la valeur de result te parait correcte?

    est un probleme de contexte? est ce que les modifications sur les attributs de ma classe, effectuées dans mon thread, sont effectives ou restent elles liées au contexte du thread?

    merci à toi

  4. #4
    Membre éclairé Avatar de Vesperal
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 81
    Par défaut
    Essaye un System.out.println("Test") dans ta méthode run() pour voir s'il y passe effectivement

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 6
    Par défaut
    hmm, c'est bien ce que je pensais, aucun des println ne s'affiche à l'ecran...

    j'essaie d'enregistrer à valeur de _result dans un recordstore

    mais je n'arrive pas à faire en sorte que la midlet attende que le recordstore soit mis à jour

    je suis de plus en plus perplexe quand à mon application

    si tu as une idée...


    encore merci de t'interesser à mon problème

  6. #6
    Membre éclairé Avatar de Vesperal
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 81
    Par défaut
    Etrange ...
    A la limite éssaye de faire hériter ta classe de Thread plutôt, et verras si ca change quelque chose.

  7. #7
    Membre confirmé
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    110
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2005
    Messages : 110
    Par défaut
    Salut,
    Il me semble (sans avoir vérifier sur le site de sun) qu'il "faut" créer un thread de ta classe runnable. J'ai utilisé cette facon de faire dans des midlet et ca marchait bien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    _answer = new Interpreter(_url); 
    Thread t=new Thread(_answer);		// crée un thread et le démarre
    t.start();
    _answer.readContents(); 
    _contents = _contents.concat(_answer.getResult());
    Si tu dois changer quelque chose dans la classe appelante, et que un getter ne marche pas (bizarre mais bon) tu peux essayer de passer une ref. de ta classe appelante à ton 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
     
    // classe appelante (MidLet ?):
    _answer = new Interpreter(this); 
    Thread t=new Thread(_answer);		// crée un thread et le démarre
    t.start();
     
    //classe runnable
    MidLet _mid;
    public Interpreter(Midlet maMidLet) 	// Classe appelante
       { 
          _mid = maMidLet ;
          _result = new String("non..."); 
          //flag = 0; 
       }
     
    public void setMidletResult() 
       { 
    _mid.result =  blablabla		// doit être acceptable si Interpreter est une classe privée
       }
    Mes classe "runnable" était locales (et private) donc je n'avais pas de probleme de visibilité. En fait tous les attributs était même publics, mais cette facon de faire implique que tu tienne compte des accès concurrentiels si actuel :-)
    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
     
    // classe appelante :
    private _uneVariable;
    _answer = new Interpreter(); 
    Thread t=new Thread(_answer);		// crée un thread et le démarre
    t.start();
     
    //classe runnable
    public Interpreter() 	
       { 
          _result = new String("non..."); 
        ....         // do what a man has to do
          //flag = 0; 
       }
    ....
    public void setMidletResult() 
       { 
    _uneVariable =  blablabla; //change une variable de la classe appelante
       }
    Sinon si c'est la classe appelante qui doit aller chercher le résultat, il me semble qu'il faut maintenir ton thread "en vie", exemple il loope et dort sur un flagg que tu actualises dans la classe appelante quand tu as lu ta valeur.

    Voilà en espérant de ne pas répondre à cote de la plaque et que cela peut t'aider :-)
    Dom

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 6
    Par défaut
    trolldom, vesperal > merci à vous deux de m'avoir aidé

    j'ai trouvé (grâce à vos indications) la marche à suivre

    il fallait que je fournisse une instance de la classe appelante (ma classe MIDlet) au 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
    50
    51
    52
    53
    54
     
    public class Interpreter implements Runnable
    {
       private String _url;
       private LaClassMIDLet midlet;
     
       public Interpreter(LaClassMIDLet midlet, String _address)
       {
          this.midlet=midlet;
          _url = _address;
       }
     
     
       public void run()
       {
          StringBuffer _b = new StringBuffer();
          StreamConnection _sc = null;
          InputStream _is = null;
          try
          {
             int _ch = 0;
             _sc = (StreamConnection)Connector.open(_url);
             _is = _sc.openInputStream();
     
             while((_ch = _is.read()) != -1)
             {
                _b.append((char) _ch);
             }
          }
          catch( Exception e )
          {
                e.printStackTrace();
                _b = new StringBuffer( "error on http connection" );
          }
          finally
          {
             if (_is != null) 
             {
                try
                {
                   _is.close();
                }catch (IOException ioe1){ioe1.printStackTrace();}
             }
             if (_sc != null)
             {
                try
                {
                   _sc.close();
                }catch (IOException ioe2){ioe2.printStackTrace();}
             }
          }
          midlet._result =new String(_b.toString());    
       }  
    }
    Ensuite, dans la classe MIDlet, j'ajoute une variable de type String
    et je modifie l'appel à Interpreter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    _answer = new Interpreter(this,_url);
    Thread t=new Thread(_answer); 
    t.start();
    _contents = _contents.concat(_result);
    Et voilà!

    encore une fois, merci à vous!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de thread : Plus de ressources système
    Par OliverSleep dans le forum C++Builder
    Réponses: 17
    Dernier message: 07/02/2006, 15h35
  2. [VB.NET] Problème de Thread
    Par Sadneth dans le forum ASP.NET
    Réponses: 26
    Dernier message: 31/01/2006, 10h12
  3. Problème synchronisation threads
    Par Linio dans le forum Concurrence et multi-thread
    Réponses: 19
    Dernier message: 11/01/2006, 16h57
  4. [MFC] Problème de Threads + Timers
    Par Invité dans le forum MFC
    Réponses: 8
    Dernier message: 30/11/2005, 10h51
  5. [VC++6][DX9] Problème de thread lors d'un blit ...
    Par grandjouff dans le forum DirectX
    Réponses: 2
    Dernier message: 12/06/2003, 22h22

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