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 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
    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 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
    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 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
    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 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
    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