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

C++Builder Discussion :

Probl�me avec TThread


Sujet :

C++Builder

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    2
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 2
    Par d�faut Probl�me avec TThread
    Bonjour, actuellement en projet de fin d'ann�e de BTS IRIS je suis oblig� de travailler sous C++Builder 5 et j'ai a cr�er un serveur TCP tournant dans un thread de fa�on � ne pas bloquer mon programme. Je suis face � un probl�me insoluble (tellement WTF) je m'en remet donc au forum si quelqu'un avait la capacit� et la patience de voir d'o� mon probl�me peut venir cela m'aiderait beaucoup ayant �puis� toutes mes ressources.
    (Je suis oblig� de faire un thread d� � la fonction accept de mon serveur tcp).

    Je vous copie/colle une partie de mon code :

    Initialisation du thread (Form1):

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
            Timer1->Enabled=1;
            tcp=new thread_tcp(&val_tcp,&vmc);


    Constructeur du thread (thread.cpp):

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    __fastcall thread_tcp::thread_tcp(bool *valeur,VMC *Vmc) : TThread(false)
    {
            serveur.init(17000);
     
            val=valeur;
            vmc=Vmc;
     
            k=*val;
     
            Form1->ListBox1->Items->Add("plop"+(AnsiString)k);
            sauv_vit_app=new float[vmc->getnbVMC()];
            bzero((float *)sauv_vit_app, sizeof(*sauv_vit_app));
    }
    Fonction Execute (bloquante, thread.cpp) :

    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
    void __fastcall thread_tcp::Execute()
    {
            int err=0;
            Form1->ListBox1->Items->Add("plooooop"+(AnsiString)k);
            while(*val)
            {
                    serveur.attenteco();
     
                    while( (err==0) && (*val==1) )
                    {
                            err=serveur.reception();
                            Synchronize(traitement);
                            err=serveur.envoie();
                    }
                    err=0;
            }
    }

    Je vous transmet aussi ce que j'ai a l'affichage dans ma ListBox :

    plop1
    plooooop0
    Avec un Evaluate/Modify je me rends compte que mon pointeur "val" n'a plus d'adresse ni de valeur. Je remercie ENORMEMENT les courageux qui jetterons un �il � �a !

  2. #2
    Expert �minent
    Avatar de ShaiLeTroll
    Homme Profil pro
    D�veloppeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 44
    Localisation : France, Seine Saint Denis (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur C++\Delphi
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par d�faut
    Etrange, normalement, on utilise plusieurs thread pour serveur
    un thread pour le accept\listen en attente d'une connexion
    un autre thread pour la communication avec les sockets ouverts qui laisse le 1er thread accept� d'autres connexions

    J'esp�re que val_tcp n'est pas une variable locale ?
    Il serait pr�f�rable que cela soit un membre priv� de Form1

    Sinon, val ne semble pas �tre tr�s utile, puisqu'il existe dans le TThread la propri�t� Terminated et la m�thode Terminate()
    Aide via F1 - FAQ - Guide du d�veloppeur Delphi devant un probl�me - Pensez-y !
    Attention Troll M�chant !
    "Quand un homme a faim, mieux vaut lui apprendre � p�cher que de lui donner un poisson" Confucius
    Mieux vaut se taire et para�tre idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la m�diocrit� !

    L'exp�rience, c'est le nom que chacun donne � ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre Expert
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    D�tails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Par d�faut
    Salut Mccleen, n'oublie pas que si tu utilises ce code:
    Citation Envoy� par Mccleen Voir le message
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
            Form1->ListBox1->Items->Add("plop"+(AnsiString)k);
    Il faut suivre cette recommandation:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //   Important: Methods and properties of objects in VCL can only be
    //   used in a method called using Synchronize, for example:
    //
    //      Synchronize(&UpdateCaption);
    //
    //   where UpdateCaption could look like:
    //
    //      void __fastcall sd::UpdateCaption()
    //      {
    //        Form1->Caption = "Updated in a thread";
    //      }
    //---------------------------------------------------------------------------

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    2
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 2
    Par d�faut Explication
    Tout d'abord merci pour vos r�ponses, je vais commencer par donner les derniers avancements. Il se trouve qu'apparemment mon programme n'est pas "faux" il n'est juste pas stable vu que au fil des essais sans modification de code (en tout cas au niveau du thread, et qui n'agis en rien dessus) mon bool val a finalement prit sa valeur ce qui m'a permis de correctement corriger ma m�thode traitement. Je peux donc dire maintenant que le code de mon serveur tcp est juste ainsi que le traitement et c'est uniquement � ce passage de valeur que cela bloque (je rappel �galement que j'ai essay� de faire passer plus de valeur (justement k perd �galement sa valeur)).
    Plus pr�cis�ment,

    ShaiLeTroll

    - Mon val_tcp est effectivement une variable priv�e de mon Form1,
    - En ce qui concerne le but de ce val_tcp :
    Il se trouve que le Terminate() ne se d�roule pas correctement si le thread est toujours en action, j'utilise donc cette valeur de cette fa�on :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
    {
            CloseDevice; //fin de la connexion avec la carte
            val_tcp=0;
            tcp->Terminate();
    }
    Ayant pass� l'adresse � l'initialisation du thread, val pointe sur l'adresse de val_tcp modifie donc sa valeur pour devenir 0 et donc terminer le while (je pr�cise que j'ai chang� le type de val pour int vu que d'apparemment C++ Builder 5 d�fini mal la taille du boll�en ce qui pouvait � mon avis possiblement cr�er des probl�mes de m�moire mais cela n'a rien chang�)

    - En ce qui concerne mon unique thread, mon projet ne pr�voit la connexion que d'un ouvrier sous andro�d pour la maintenance des VMC (Ventilation M�canique Control�e aucazou) c'est une modification que j'apporterai � l'occasion mais vu les probl�mes que m'attire les thread avec CB5 j'h�site :/

    Crayon :

    - Cet affichage a pour seul but de palier au fait que je ne PEUX pas mettre 2 points d'arr�t en tout cas un suppl�mentaire � l'int�rieur de la m�thode Execute() du thread, je l'ai fait pour voir si �a passait, pr�cision il est impossible de passer un param�tre avec Synchronize ()

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    �tudiant
    Inscrit en
    Juin 2011
    Messages
    4
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 4
    Par d�faut
    Pour avoir vu le prog tourner je peux aussi pr�ciser que sa fonction accept() n'est pas bloquante � tous les coups. Ce qui est �trange.

    J'utilise aussi le meme code (quasi identique) et je ne rencontre aucuns de ces probl�mes.

Discussions similaires

  1. Probl�me avec TThread
    Par Onimaru dans le forum API, COM et SDKs
    R�ponses: 9
    Dernier message: 12/12/2011, 18h29
  2. R�ponses: 12
    Dernier message: 05/11/2007, 14h05
  3. Probl�me avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    R�ponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Probl�me avec la m�moire virtuelle
    Par Anonymous dans le forum CORBA
    R�ponses: 13
    Dernier message: 16/04/2002, 16h10

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