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 :

Pthread et form [Débutant]


Sujet :

C++Builder

  1. #1
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2009
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2009
    Messages : 114
    Par défaut Pthread et form
    bonjour ,

    Etant débutant , je cherche des infos sur les thread sur Borland .

    Actuellement , je cherche à afficher un dialogue de progression pendant un traitement lourd en arrière . J'ai essayé avec les thread . le dialogue s'affiche bien .

    Par contre en fermeture d'application , g une erreur " Handle de fenêtre non valide " .

    merci

    @ +

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 206
    Par défaut
    Salut,

    Un peu de code permettrait de pouvoir mieux t'aider.
    Sur quelle ligne se produit le plantage ?

  3. #3
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    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 081
    Par défaut
    Ne mets pas Application ou une autre Form comme Owner de la Fenêtre de Progression !
    Si c'est déjà fait, veille à ce que la création de l'objet ProgressForm et la libération soit dans le même thread, de même pour le Show et le Close\Hide
    Effectivement, Windows n'aime pas que l'on manipule des Handles d'un Thread à un autre quand ces Handles ne sont pas conçu pour cela, d'où l'OSError 1400
    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

  4. #4
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2009
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2009
    Messages : 114
    Par défaut
    Ok merci pour vos réponse .

    Autrement comment on fait pour faire afficher un mini dialogue avec une TProgressiveBar et quelques TLabel durant le traitement en arrière ?

    Je n'arrive pas à trouver des exemples

    merci

  5. #5
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2009
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2009
    Messages : 114
    Par défaut
    Citation Envoyé par parabole33 Voir le message
    Ok merci pour vos réponse .

    Autrement comment on fait pour faire afficher un mini dialogue avec une TProgressiveBar et quelques TLabel durant le traitement en arrière ?

    Je n'arrive pas à trouver des exemples

    merci
    G fait ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     ProgressBar = new TProgressBar(Form2);
      //ProgressBar->Parent=Form2 ; <-- Erreur  l'OSError 1400
     ProgressBar->Visible = true ;
     ProgressBar->Position=50 ;
    Pour les label , cela fonctionne . Pour la bar , pas visible et erreur

    aie .... help !

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    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 081
    Par défaut
    Form2 est créé dans le thread principal je suppose !
    ProgressBar est créé dans le thread secondaire ?

    Encore une fois, je me répète ne mélange pas les Handles entre les différents Threads !

    Laisse la ProgressBar en fsStayOnTop (et BringToFront) sans Parent

    Ton traitement lourd, c'est une boucle ou un traitement que tu lances sans pour avoir de contrôle de dessus (genre un autre exe) ?

    Si boucle, utilise les évènements, fait tes propres Event de progression qui utilise Synchronize, voir comment est codé OnClick, DoClick ainsi que OnWrite et DoWrite utilisé en Synchronise dans ScktComp (.hpp et .pas), c'est du code VCL mais cela se comprend pour le refaire en C++

    Si traitement bloquant, lance le dans le thread et utiliser un Timer pour simuler un semblant d'activité !
    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

  7. #7
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2009
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2009
    Messages : 114
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Form2 est créé dans le thread principal je suppose !
    ProgressBar est créé dans le thread secondaire ?

    Encore une fois, je me répète ne mélange pas les Handles entre les différents Threads !

    Laisse la ProgressBar en fsStayOnTop (et BringToFront) sans Parent

    Ton traitement lourd, c'est une boucle ou un traitement que tu lances sans pour avoir de contrôle de dessus (genre un autre exe) ?

    Si boucle, utilise les évènements, fait tes propres Event de progression qui utilise Synchronize, voir comment est codé OnClick, DoClick ainsi que OnWrite et DoWrite utilisé en Synchronise dans ScktComp (.hpp et .pas), c'est du code VCL mais cela se comprend pour le refaire en C++

    Si traitement bloquant, lance le dans le thread et utiliser un Timer pour simuler un semblant d'activité !
    Vu la tournure des évènements , je supprime la ProgressBar ...

    Les controles Tlabel fonctionnent très bien avec cette Form . Alors cela suffira ....

    Si quelqu'un a un exemple complet sous Borland pour mieux comprendre , je suis preneur

    merci quand même.....

  8. #8
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    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 081
    Par défaut
    Tu n'as pas répondu à ma question :

    Form2 est créé dans le thread principal je suppose !
    ProgressBar est créé dans le thread secondaire ?
    Pourquoi tu ne crées pas une petite fenêtre avec l'IDE, avec des Labels et ProgressBar
    Et cette fenêtre tu l'affiches avec Show lorsque tu as besoin d'afficher une progression, tu encapsule ça dans un objet, objet que tu peux appeler depuis un Thread par synchronize ou par ton propre système de retardeur de message

    J'ai utilisé des ProgressBar avec des Threads, avec un petit peu d'effort et de rigueur dans le Code, cela fonctionne très bien !

    Sinon
    Label = TGraphicControl = Pas de Handle que du dessin !
    ProgressBar = TWinControl = Handle !
    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

  9. #9
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2009
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2009
    Messages : 114
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Tu n'as pas répondu à ma question :



    Pourquoi tu ne crées pas une petite fenêtre avec l'IDE, avec des Labels et ProgressBar
    Et cette fenêtre tu l'affiches avec Show lorsque tu as besoin d'afficher une progression, tu encapsule ça dans un objet, objet que tu peux appeler depuis un Thread par synchronize ou par ton propre système de retardeur de message

    J'ai utilisé des ProgressBar avec des Threads, avec un petit peu d'effort et de rigueur dans le Code, cela fonctionne très bien !

    Sinon
    Label = TGraphicControl = Pas de Handle que du dessin !
    ProgressBar = TWinControl = Handle !
    merci de ta patience à mon pb !

    Form2 est créé dans le thread principal je suppose ! => oui !

    ProgressBar est créé dans le thread secondaire ? --> oui à la création de la Form2.

    En effet , j'ai crée une petite fenêtre avec un label et ProgressBar .
    Je l'affiche avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void __fastcall TMonThread::Execute()
    {
       Form2-> Show();
    }
    et elle démarre . C le control ProgressBar qui pose pb . Comme tu dit cela doit être en rapport avec TWinControl . Les label : OK
    Le ProgressBar ne s'affiche même pas dans la form au lancement . Donc plantage à la destruction ...
    Si je comprend enfin l'astuce , je poserai un timer pour faire tourner la barre .

    Je suis étonner de ne rien trouver sur le NET en Borland C++ sur ca ???

  10. #10
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    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 081
    Par défaut
    Form2 est créé dans le thread principal je suppose ! => oui !
    ProgressBar est créé dans le thread secondaire ? --> oui à la création de la Form2.
    Euh ! tu te contredis ! tu n'as pas vu la différence ?

    Sinon, ton thread, il est un peu court non ?
    Ta fenêtre s'affiche et pouf le thread, il s'arrête !
    ça doit faire mal, la fenêtre est encore là ???

    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
    void __fastcall TMonThread::Execute()
    {
       Form2-> Show();
       try
       {
          while (BooleanGlobalQuiDitQueLeTraitementTourne) // pas besoin de SC pour ce genre de valeur
          {
            PumpMessages(); // Moins brutal que Application.ProcessMessages(); // A Tester SANS ! 
            Sleep(1);
          }
       }
       __finally
       {
         Form2-> Hide();
       }
    }
    Désolé, je n'ai pas encore fait ça en C++, donc voici ce que j'ai déjà fait en Delphi
    Ajoute PumpMessages si besoin !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure PumpMessages;
    var
       Msg: TMsg;
    begin
         while PeekMessage(Msg, 0, 0, 0, pm_Remove) do begin
               TranslateMessage(Msg);
               DispatchMessage(Msg);
         end;
    end;
    Et puis Show ce n'est pas bloquant !
    Tu peux l'utiliser SANS thread !

    Autre Question :
    Ton traitement est une boucle que tu as faite ou un traitement bloquant extérieur (SQL de plusieurs minutes, Exe externe, DLL, ...) ?


    Tu devrais lancer le traitement dans le thread secondaire et laisser la progression dans le thread principal (avec PostThreadMessage tu peux faire des choses sympas !)
    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

  11. #11
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2009
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2009
    Messages : 114
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Euh ! tu te contredis ! tu n'as pas vu la différence ?

    Sinon, ton thread, il est un peu court non ?
    Ta fenêtre s'affiche et pouf le thread, il s'arrête !
    ça doit faire mal, la fenêtre est encore là ???

    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
    void __fastcall TMonThread::Execute()
    {
       Form2-> Show();
       try
       {
          while (BooleanGlobalQuiDitQueLeTraitementTourne) // pas besoin de SC pour ce genre de valeur
          {
            PumpMessages(); // Moins brutal que Application.ProcessMessages(); // A Tester SANS ! 
            Sleep(1);
          }
       }
       __finally
       {
         Form2-> Hide();
       }
    }
    Désolé, je n'ai pas encore fait ça en C++, donc voici ce que j'ai déjà fait en Delphi
    Ajoute PumpMessages si besoin !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure PumpMessages;
    var
       Msg: TMsg;
    begin
         while PeekMessage(Msg, 0, 0, 0, pm_Remove) do begin
               TranslateMessage(Msg);
               DispatchMessage(Msg);
         end;
    end;
    Et puis Show ce n'est pas bloquant !
    Tu peux l'utiliser SANS thread !

    Autre Question :
    Ton traitement est une boucle que tu as faite ou un traitement bloquant extérieur (SQL de plusieurs minutes, Exe externe, DLL, ...) ?


    Tu devrais lancer le traitement dans le thread secondaire et laisser la progression dans le thread principal (avec PostThreadMessage tu peux faire des choses sympas !)
    Bonne idée !

    Très intéressant mais mon dieux c pour les pro

    Mon traitement bloquant est les OLE Excel . Comme cela dure , un simple dialogue qui faisait patienter !!!

    Plus simple de faire l'inverse !

    Je te tien au courant

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

Discussions similaires

  1. Réponses: 87
    Dernier message: 06/07/2011, 15h33
  2. Héritage entre Forms
    Par BarBal dans le forum Composants VCL
    Réponses: 7
    Dernier message: 29/08/2002, 17h44
  3. [Kylix] SIGSEGV 11 - creation form
    Par pram dans le forum EDI
    Réponses: 1
    Dernier message: 29/08/2002, 15h24
  4. [FORMS] Chemin des icones (intégré FAQ 150 QR)
    Par jerome62 dans le forum Forms
    Réponses: 2
    Dernier message: 30/07/2002, 08h32
  5. Form principale non visible au demarrage!!!!
    Par toufou dans le forum Composants VCL
    Réponses: 2
    Dernier message: 20/07/2002, 21h49

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