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 :

[Thread] Ne se termine pas + ne rends jamais la main au prog


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2002
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2002
    Messages : 146
    Points : 76
    Points
    76
    Par défaut Thread ne se termine pas + ne rends jamais la main au prog
    Salut !

    Je dois charger des arborescences de +/- 15000 items à partir d'une DB. Pour ce faire je charge chaque arborescence dans un TTreeView, afin de profiter de ses fonctionnalité (celui-ci n'est jamais affiché, juste utilisé pour la navigation). J'ai donc créé une TList de TTreeView que je viens peupler au démarrage de l'appli.

    J'utilise un Thread pour cela, afin que l'utilisateur puisse garder la main sur le soft pendant le chargement (+/- 2 minutes) - Le temps de se loguer etc... on gagne un peu de temps ...

    J'ai 2 problemes (tres liés a mon avis )

    1°) Je ne rentre jamais dans ma procedure OnTerminate
    2°) Le thread s'execute au démarrage du programme mais ne rends jamais la main à l'utilisateur, donc ca bloque et mon Thread ne sert a rien en plus comme il ne se termine pas ...

    J'ai lu quelques tutos sur ce site mais n'ai pas trouvé l'info ...

    Voici un peu de code :

    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
    45
    46
    47
    48
    49
    50
    51
     
    type
      TChapterLoader = class(TThread)
     
      private
        { Déclarations privées }
     
        Procedure MakeTree(ChapterID : Integer; tvwChapterTree : TTreeView);
     ...
        procedure   OnTerminateProcedure(Sender : TObject);
      protected
        procedure Execute; override;
     
      public
        ThreadTerminated : Boolean;
     
        constructor Create(Suspended: Boolean);
      end;
     
     
    constructor TChapterLoader.Create(Suspended : Boolean);
    Begin
        FreeOnTerminate := True;
        inherited Create(Suspended);
        Priority      := tpHigher;
        VirForm     := TForm.Create(frmMain);<- form que je créé uniquement pour que le composant ait un parent
        OnTerminate := OnTerminateProcedure;
    end;
     
     
    procedure TChapterLoader.Execute;
    var
        i : Integer;
        NewTreeView : TTreeview;
    begin
      { Placez le code du thread ici }
      FillStrListWithChapters(CHAPTER_LIST); <- stringlist utile dans mon prog...
      ThreadTerminated := False;
      for i := 0 to CHAPTER_LIST.Count - 1 do Begin
          NewTreeView        := TTreeview.Create(VirForm);
          NewTreeView.Parent := TWinControl(VirForm);
          Self.MakeTree(Integer(CHAPTER_LIST.Objects[i]), NewTreeView); <-appel de fonction récursive pour l''arborescence...
          CHAPTER_TVW_LIST.Add(Pointer(NewTreeView)); <- Ajout de mon TTreeView dans ma TList
      End;
    end;
     
    // Ne rentre jamais dans cette fonction !!!! :(
    procedure TChapterLoader.OnTerminateProcedure(Sender : TObject);
    Begin
        ThreadTerminated := True;
    End;
    Merci pour votre aide

  2. #2
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Ben à mon avis ça vient surtout de ce qu'il est interdit de faire des appels API threadés. Et utiliser un TTreeView dans ton thread revient à faire ça.

    D'ailleurs, c'est vraiment affreux d'utiliser un composant visuel uniquement comme structure de données !
    Récris tes propres objets de gestion de l'arbre et tout ira bien. Ce sera même nettement plus rapide.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2002
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2002
    Messages : 146
    Points : 76
    Points
    76
    Par défaut
    Merci sjrd,

    Je suis en effet conscient que utiliser un composant visuel n'est pas la meilleure solution, malheureusement pris par le temps, j'ai voulu profiter de quelque chose de tout fait, pret à l'emploi, pour la gestion d'une arborescence...

    Un de mes collègue vient de me sugerer d'utiliser plutot les classes TTreeNodes et TTreeNode afin de se libérer de l'aspect composant... à tester...

    En ce qui concerne la rapidité d'execution, je pense que dans ce cas ci, elle est aussi et surtout tributaire de l'acces à la DB (Création et execution de queries à la volée)

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Août 2002
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2002
    Messages : 146
    Points : 76
    Points
    76
    Par défaut
    Voila, j'ai apparement trouvé la solution.

    Il n'est pas possible d'utiliser les classes TTreeNodes et TTreeNode car elles demandent un owner de type TCustomTreeView...

    J'ai trouvé un composant issu de Rm Component, nommé TrmTreeNonView qui est un TreeView 'non visuel', assez rapide et qui apparement possède les mêmes fonctionnalités du TreeView que ce que j'avais besoin... je dois encore le tester mais le Thread fonctionne bien )

    (http://www.mills-enterprise.ca/software/rmcontrols.html)

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

Discussions similaires

  1. thread qui ne se termine pas
    Par Samb95 dans le forum Général Python
    Réponses: 1
    Dernier message: 18/08/2010, 16h15
  2. [Thread du Swing] Rend-moi la main quand t'as fini!
    Par janef dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 25/02/2006, 15h51
  3. Threads : probleme de Terminate
    Par Bissada dans le forum Langage
    Réponses: 3
    Dernier message: 20/02/2006, 14h13
  4. [Thread] PB Thread.sleep(1000) marche pas
    Par kliel dans le forum Concurrence et multi-thread
    Réponses: 6
    Dernier message: 03/12/2004, 13h47
  5. [TTHREAD] ne termine pas sont exécution
    Par Bbenj dans le forum Langage
    Réponses: 4
    Dernier message: 02/08/2002, 16h42

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