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

Langage Delphi Discussion :

afficher une fenêtre dans le thread


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 76
    Points : 55
    Points
    55
    Par défaut afficher une fenêtre dans le thread
    Bonjour,

    J’ai besoin d'afficher la fenêtre d'attente avec un progressbar pendant le calcul de la taille des fichiers. Mais si je l'affiche juste comme ça elle se fige. Donc j'ai créé le thread qui doit seulement afficher cette fenêtre et changer la valeur de son progressbar. Mais ça se fige quand même. S'il vous plait, est-ce que quelqu'un peut me dire qu'est-ce que ne va pas.

    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
     
     TCalculTaille = class(TThread)
      private 
       tform: TFormEnCours;
      protected
      public
        procedure Execute; override;
       Constructor Create(form: TFormEnCours);
      end;
     
    Constructor TCalculTaille.Create(form: TFormEnCours);
    begin 
      tform := form;
      tform.spSkinGauge1.Value := 0;
      tform.Show;
      FreeOnTerminate := true;
      inherited Create(false);
    end;
     
    procedure TCalculTaille.Execute;
    var
      iprogress: integer;
    begin 
      iprogress := 0;
      while not terminated do
        begin
          if iprogress < 100 then
             iprogress := iprogress + 1
          else
             iprogress := 0;
          tform.Gauge1.Value := iprogress;
          sleep(50);
        end;
      tform.Close;
    end;
    //---------dans le module principale
    th: TCalculTaille;
     
    FormEnCours := TFormEnCours.Create(Self);
    th := TCalculTaille.Create(FormEnCours);

  2. #2
    DMO
    DMO est déconnecté
    Membre averti
    Avatar de DMO
    Profil pro
    Inscrit en
    Février 2004
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 290
    Points : 343
    Points
    343
    Par défaut
    Pour qu'un thread puisse modifier l'affichage, il faut passer par synchronize, ce qui fonctionne, mais synchronise ton thread avec le thread principal, ce qui te fait perdre l'interet d'un thread. Donc un thread qui ne fait que de l'affichage n'a aucun intéret.

    Je te suggère plutot lors de tes calculs de modifier la progressbar et de ne rafraichir que cela, ou de faire des Application.ProcessMessage, mais ce peut etre dangeureux.

  3. #3
    Membre éprouvé
    Avatar de neilbgr
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 651
    Points : 1 177
    Points
    1 177
    Par défaut
    Lorsque qu'on fait fichier->nouveau->Thread on a dans l'unité créée :
    { Important : les méthodes et propriétés des objets de la VCL ou CLX peuvent uniquement être
    utilisées dans une méthode appelée avec Synchronize. Par exemple,

    Synchronize(UpdateCaption);

    UpdateCaption ayant l''apparence suivante :

    procedure Test.UpdateCaption;
    begin
    Form1.Caption := 'Updated in a thread';
    end; }

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 76
    Points : 55
    Points
    55
    Par défaut
    J'ai essayé faire ça, mais je comprend pas pourquoi quand je met Timer sur ma fenêtre qui est programmé pour rafraîchir la progressbar, ça ne fonctionne pas : la progressbar ne se rafraîchi pas.

    PS: ici la Synchronize ne fonctionne pas car ce n'est pas une application standard de delphi.

  5. #5
    DMO
    DMO est déconnecté
    Membre averti
    Avatar de DMO
    Profil pro
    Inscrit en
    Février 2004
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 290
    Points : 343
    Points
    343
    Par défaut
    Le Timer n'est pas une solution. Si ton programme tourne à fond, il n'aura pas le temps de se déclencher avant la fin. Il faut que tu intercales au milieu de ton traitement lourd un évènement ou quelquechose qui te permette de modifier l'affichage.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 76
    Points : 55
    Points
    55
    Par défaut
    Ah ok! Merci!
    Mais qu'est-ce qu'on peut faire s'il faut afficher une fenêtre pendant les traitements lourds et cette fenêtre doit refleter l'état des traitements (par exemple la progression globale de téléchargement des données). L'information s'affiche bien mais on peut pas bouger cette fenêtre avec une sourie, elle se minimise qu'apres un bon moment et etc.

  7. #7
    DMO
    DMO est déconnecté
    Membre averti
    Avatar de DMO
    Profil pro
    Inscrit en
    Février 2004
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 290
    Points : 343
    Points
    343
    Par défaut
    La réponse à cette question a déjà dû être donnée de nombreuses fois, mais voici : ton application ne traite pas les messages tant qu'elle est occuppé dans ton traitement lourd.

    Tu as de nombreuses solutions :
    - Ne pas te soucier de pouvoir modifier l'ihm, et simplement ne rafraichir que la ProgressBar pendant ton traitement
    - Au lieu de ne rafraichir que ta progressbar, toujours "au milieu" de tron traitement, faire des Application.ProcessMessages, qui obligeront à traiter les messages (déplacements de souris, rafraichissements, etc...)
    - Beaucoup mieux : exactement l'inverse de ce que tu proposais au départ : laisser la gestion de l'ihm au thread principal, il est fait pour ca, et faire tout le traitement lourd dans un thread à coté, qui ne vient que de temps en temps (avec Synchronise comme te l'a bien expliqué Neilbgr) rafraichir la ProgressBar (pas trop souvent non plus histoire de ne pas trop ralentir ton thread).

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 76
    Points : 55
    Points
    55
    Par défaut
    Merci.
    Et si je ne peut pas utiliser Synchronize dans cette application, a-t-il d’autre possibilité de réaliser la troisième solution (je veut dire avec un thread pour les traitements)?

    PS: en plus je peut pas ecrir "Application.ProcessMessages" car ce n'est pas une application. Donc presque aucune solution ne marche pas ici .

  9. #9
    DMO
    DMO est déconnecté
    Membre averti
    Avatar de DMO
    Profil pro
    Inscrit en
    Février 2004
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 290
    Points : 343
    Points
    343
    Par défaut
    Je crois que tu as suffisament d'informations pour résoudre ton problème. Cherche un peu par toi même comment mettre en oeuvre la solution qui te semble la plus adaptée à ton cahier des charges. Je ne veux pas m'immisser dans la conception de ton logiciel. Bien sûr tu pourras revenir poser des d'autre questions bien précises si tu as d'autres problèmes.

    Allez bon dev'

Discussions similaires

  1. [XL-2007] Afficher une fenêtre dans le style de la fenêtre TCD
    Par jpclabaux dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 21/11/2012, 18h45
  2. Afficher une fenêtre dans JPanel
    Par addrock dans le forum Général Java
    Réponses: 2
    Dernier message: 06/12/2011, 08h42
  3. afficher une fenêtre dans un panel
    Par Yotho dans le forum Windows Forms
    Réponses: 4
    Dernier message: 19/01/2007, 10h14
  4. afficher une image dans une fenêtre windows
    Par yashiro dans le forum Bibliothèques
    Réponses: 3
    Dernier message: 02/05/2006, 16h30
  5. Afficher une fiche dans un thread
    Par abatonime dans le forum Langage
    Réponses: 5
    Dernier message: 05/11/2005, 22h26

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