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 :

Threads et Affichage


Sujet :

C++Builder

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2007
    Messages : 8
    Par défaut Threads et Affichage
    Bonjour,

    J'ai un problème lorsque j'essaie d'afficher des données provenant d'une thread dans un Form. J'ai conçu ce petit prog. afin d'essayer de comprendre ce qui ce passe, car j'ai ce problème dans un plus gros programme. Or j'essaie d'afficher des données à partir d'une thread et de la form. J'ai essayé plusieur chose les lock, semaphore etc... , mais le problème est que je ne peux pas arrêter mon prog principal. de plus, les locks, ne fonctionnait pas bien.

    Avec ce code j'ai deux problèmes, le premier est un message d'erreur qui indique "Le canevas ne permet pas de dessiner." et le deuxième problème que je rencontre est que dans le coin supérieur de mon écran, pas de ma form, de mon écran, il y a du data qui s'affiche la

    En passant j'utilise la version 5 et 2006 de bcb, et dans les deux versions j'ai le même problèmes.

    Voici le code de la 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
     
    //---------------------------------------------------------------------------
     
    #include <vcl.h>
    #pragma hdrstop
     
    #include "Unit1.h"
    #include "Unit2.h"
    #pragma package(smart_init)
    //---------------------------------------------------------------------------
     
    __fastcall test::test(bool CreateSuspended) : TThread(CreateSuspended){}
    //---------------------------------------------------------------------------
    void __fastcall test::Execute()
    {
       unsigned char i = 255;
     
       while (1){
          Sleep(50);
          Form1->Affichage(i--);
       }
    }
    Et voici le code du programme principale :
    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
     
    //---------------------------------------------------------------------------
     
    #include <vcl.h>
    #pragma hdrstop
     
    #include "Unit1.h"
    #include "Unit2.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    test   *threadtest;
     
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
       : TForm(Owner)
    {}
    //---------------------------------------------------------------------------
     
    // l'interval du timer est de 50 Ms
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
       static unsigned char i = 0;
       Label1->Caption = i++;
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::FormShow(TObject *Sender)
    {
       threadtest = new test(false);
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
    {
       threadtest->Suspend();
       delete threadtest;
    }
    //---------------------------------------------------------------------------
     
    void TForm1::Affichage(int i)
    {
       Label2->Caption = i;
    }
    Merci d'avance

  2. #2
    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, quand tu crée un nouveau thread c'est clairement indiqué dans ton fichier cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //   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 temp::UpdateCaption()
    //      {
    //        Form1->Caption = "Updated in a thread";
    //      }

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2007
    Messages : 8
    Par défaut
    Mais supposons que nous utilisons les threads en API, y a t-il une méthode en API qui ferait la même chose que Synchonize ?

  4. #4
    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
    Si tu veux plus de renseignement sur les thread tu peux aller sur: http://chgi.developpez.com/thread/

  5. #5
    Membre expérimenté

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2003
    Messages : 288
    Par défaut
    Il y a une technique simple, performante et surtout non bloquante d'affichage a partir d'un thread c'est de passer par la boucle de messages (PostMessage avec des messages de type WM_USER).
    C'est la message queue qui se charge de la synchronization pour toi et le fait très bien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ex.
    #define WM_USR_LOADED   WM_USER+1
     
    ::PostMessage(m_hWnd, WM_USR_LOADED, (WPARAM)toto, (LPARAM)titi);
    Un point sur lequel il faut être vigilant c'est l'allocation/libération de resources entre les 2 threads. Mais c'est aussi un problème en général, n'est ce pas ?

    Yarp
    www.senosoft.com

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

Discussions similaires

  1. 2 threads d'affichage swing
    Par dideux dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 10/04/2008, 13h04
  2. [C# 2.0] Thread d'affichage
    Par OtI$ dans le forum Windows Forms
    Réponses: 4
    Dernier message: 07/06/2007, 12h07
  3. [1.1] Comment accéder au thread d'affichage ?
    Par fregolo52 dans le forum Framework .NET
    Réponses: 1
    Dernier message: 20/09/2006, 11h27
  4. [MFC] thread d'affichage
    Par Joeleclems dans le forum MFC
    Réponses: 31
    Dernier message: 23/05/2005, 14h47
  5. Thread et affichage direct3D plein écran
    Par Harry_polin dans le forum DirectX
    Réponses: 8
    Dernier message: 13/03/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