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 054
    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 054
    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. [TThread] Problème avec l'évènement OnTerminate
    Par coax81 dans le forum Langage
    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