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

Delphi Discussion :

Construction menu dans un thread


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 129
    Par défaut Construction menu dans un thread
    Bonjour,

    Je suis sur un petit projet composé d'un client delphi et d'une appli php.
    Le client à besoin de construire une partie de son menu en requetant l'appli php, pour afficher des liens web définis dans le portail php.
    Le client recupere un flux xml de l'appli php, et le parse pour créer son menu, jusqu'a present je faisais ça au lancement du client, mais si le serveur web est long à repondre cela "bloque" l'appli.
    J'ai donc voulu faire ça dans un thread, en suivant la faq delphi.

    Je bloque sur l'ajout de l'item dans le menu qui me génere une violation d'accés....
    voici la partie de création du menu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        for j:=0 to xmldoc.ChildNodes.Nodes[I].ChildNodes.Count-1 do
          begin
            if xmldoc.ChildNodes.Nodes[I].ChildNodes.nodes[j].nodename='link' then
             begin
                //construit l'item menu lien web
                ItemMenu:=TMenuItem.Create(Application);
                ItemMenu.Caption:=xmldoc.ChildNodes.Nodes[I].ChildNodes.nodes[j].AttributeNodes['name'].text;
                ItemMenu.Hint:=xmldoc.ChildNodes.Nodes[I].ChildNodes.nodes[j].AttributeNodes['url'].text;
                ItemMenu.OnClick:=FicMain.Link_Browser;     
                ficmain.Menu_links.Insert(ficmain.Menu_links.Count,ItemMenu);// <= violation d'accés
                ficmain.Menu_main.MenuAdded;
             end;
           end;
    Apparement quand on touche a un objet vcl il faut sortir le code qui le modifie dans une methode appelée par synchronise, donc j'ai tenté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
          procedure MenuThread.Updatemenu;
      var
      ficmain:Tf_main;
        begin
     
                ficmain.Menu_links.Insert(ficmain.Menu_links.Count,ItemMenu_org);
                ficmain.Menu_main.MenuAdded;
        end;
    et remplacé les lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
                ficmain.Menu_links.Insert(ficmain.Menu_links.Count,ItemMenu);
                ficmain.Menu_main.MenuAdded;
    par Synchronize(Updatemenu) (ItemMenu_org est une variable de la classe du thread, que j'initialise avec ItemMenu avant d'apeller le Synchronize).

    Donc si quelqu'un peut m'aiguiller merci beaucoup, je suis aussi preneur d'une eventuelle solution plus adapté à cette problematique de creation du menu au lancement

    merci d'avance.

  2. #2
    Membre Expert
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    je ne suis pas expert en creation ed menus dynamique mais je te conseille d'abort de tester ton processus de creation des menus directement depuis la form, en chargeant par exemple, un XML sur le HDD.
    Si cela marche, tu peux delocaliser l'appel (initialiement fait dans le create) a la fonction de creation du menu dans un thread, via la methode synchronise.
    La dessus aucun doute : Tout appel a la VCL doit se faire dans le thread principal donc via une procedure synchromise.

    D'autre aprt, il faut egalemetn s'assurer que le thread n'est pas executé avant la creation complete de la fiche, sinon tu risque d'avoir des problemes de parentees ...

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 129
    Par défaut
    La creation du menu marche parfaitement avec l'ancienne methode, donc directement sur la form de base.
    Tu me conseille donc de laisser la methode de construction sur la form principale, et de delocaliser uniquement son appel dans le thread?

  4. #4
    Membre Expert
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    tout a fait
    mais en passant par une methode d'appel specialisée si ta fonction n'ets pas compatible avec le parametre de la fonction synchronize.
    Sinon directement via synchronise.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 129
    Par défaut
    J'avoue ne pas tout comprendre sur le Synchronize...
    J'ai essayé de faire appel dans le executre du thread a ma methode de construction du menu (qui est dans la form principale) avec un Synchronize:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    procedure MenuThread.Execute;
      var
      ficmain:Tf_main;
                begin
      { Placez le code du thread ici }
      Self.Synchronize(ficmain.Xml_Menu_Construction);
      {fin thread}
    end;
    Toujours la violation d'accés...
    Si qqun à une doc expliquant en profondeur le fonctionnement des threads, vu que sur la faq c'est relativement court, merci ^^

  6. #6
    Membre Expert
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    je pense que ca ne viens pas du thread mais de ta fonction ...
    Normalement ca devrais marcher.

Discussions similaires

  1. Ajout Menu dans un PopupMenu
    Par Larion dans le forum C++Builder
    Réponses: 6
    Dernier message: 15/08/2004, 12h45
  2. [Process]Execution de process dans un thread
    Par devjava dans le forum Concurrence et multi-thread
    Réponses: 5
    Dernier message: 18/06/2004, 10h34
  3. erreur d'un timer declaré dans un thread
    Par hak5 dans le forum C++Builder
    Réponses: 2
    Dernier message: 03/04/2004, 09h20
  4. Gestion des message windows dans les threads
    Par billyboy dans le forum Windows
    Réponses: 5
    Dernier message: 06/10/2003, 17h25
  5. Inserer Un Menu dans un autre en execution
    Par apt dans le forum Composants VCL
    Réponses: 2
    Dernier message: 12/08/2002, 11h22

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