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


Sujet :

Langage Delphi

  1. #1
    Membre expérimenté
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 984
    Points : 1 419
    Points
    1 419
    Par défaut thread fonction main
    Bonjour, j'ai un thread je voudrais qu'il execute un fonction qui est dans Form1 à la fin du traitement afin de remettre toute sorte éléments bouton etc dans un autre état

    j'ai trouvé ceci:
    http://dn.codegear.com/article/22411

    a la fin il y a un postmessage qui execute une fonction de main est-ce que c'est la meilleur solution?

    J'ai un tmemo qui contient l'avancement du thread, je le passe en argument à la création du thread
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    constructor TTCleanner.Create(ALogPath: String; AmResult: TMemo);
    et je l'utilise ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TTCleanner.SetMsgResult(Msg: String);
    begin
      MsgResult := Msg;
      Synchronize(SendMsgResult);
    end;
     
    procedure TTCleanner.SendMsgResult;
    begin
      mResult.Lines.Add(MsgResult);
    end;
    si je fait pareil pour tout mes boutons etc sa ferai beaucoup.
    sinon je pourrai mettre
    dans mon thread mais je trouve pas sa propre j'ai raison?

    Merci
    Il existe 3 sortes de gens: ceux qui savent compter et ceux qui ne savent pas.

  2. #2
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 173
    Points
    4 173
    Par défaut
    a la fin il y a un postmessage qui execute une fonction de main est-ce que c'est la meilleur solution?
    La meilleure, c'est une question de point de vue...
    Maintenant pour le problème que tu décris, c'est bien ma méthode préférée : Tu as un thread qui fait un traitement, à la fin du traitement tu veux notifier la form qu'elle doit se mettre à jour pour reflêter le nouvel état du système. Tu lui post un message pour qu'elle fasse son traitement, dans le context du thread principal.

    Pour ce qui est de l'utilisation de Synchronize, je dois dire que j'y suis plutôt allergique. Synchronize est une bidouille Delphi pour exécuter la méthode que tu indiques dans le context du thread principal : Synchronize va faire en sorte que le thread principal exécute ta méthode. Le thread secondaire va alors attendre que le thread principal termine l'exécution avant de reprendre la main.
    Ca signifie que l'exécution de ton programme s'effectue tanto sur le thread principal, tanto sur le thread secondaire alors que si on fait du multi-thread c'est quand même pour que les deux traitements s'exécutent simultanéments et optimiser l'utilisation des ressources CPU de la machine...

    sinon je pourrai mettre
    dans mon thread mais je trouve pas sa propre j'ai raison?
    Non seulement ce n'est pas propre, mais en plus il ne faut surtout pas le faire.
    La VCL n'est pas thread-safe. Les composants visuels Delphi ne doivent pas être manipulés depuis plusieurs threads.
    La règle c'est de n'utiliser la VCL que depuis le thread principal...

  3. #3
    Membre expérimenté
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 984
    Points : 1 419
    Points
    1 419
    Par défaut
    d'accord merci, donc PostMessage est la solution, je pensai bien du coup sa fait 1h que je lis et test mais j'y arrive pas pour l'instant.

    Je me suis inspiré de ce post: http://www.developpez.net/forums/d34...e/#post2126243

    pour tester j'ai créé un bouton sur la fiche principal avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    procedure TMain.WMUSER(Msg: TMessage); // message WM_USER
    begin
    showmessage(inttostr(msg.Msg));
    //  RunParsing;
    end;
     
    procedure TMain.Button1Click(Sender: TObject);
    begin
    PostMessage(Handle,WM_USER,0,1);
    end;
    a la compilation j'ai:
    [DCC Avertissement] fmMain.pas(38): H2219 Le symbole privé 'WMUSER' est déclaré mais jamais utilisé
    et lors du click rien.

    edit: ok la c'est expliqué http://alphomega.developpez.com/EchangeVal/ j'essaye

    par contre avec cette methode tout les programmes peuvent lancer ces commandes c'est pas sécurisé du tout?
    Il existe 3 sortes de gens: ceux qui savent compter et ceux qui ne savent pas.

  4. #4
    Membre expérimenté
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 984
    Points : 1 419
    Points
    1 419
    Par défaut
    voila j'ai fini dans ma fiche principal j'ai:

    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
     
    const
     WM_THREAD_FINISHED = WM_USER + 1;
     
    type
      TMain = class(TForm)
      public
        procedure ThreadFinished(var Msg: TMessage);message WM_THREAD_FINISHED;
      end;
     
    implementation
     
    procedure TMain.ThreadFinished(var Msg: TMessage);
    begin
      RunParsing;
    end;
    à la création de mon thread j'envoie le handle de ma fiche principal et ainsi à la fin du thread je lance:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PostMessage(HandleMain,WM_THREAD_FINISHED);
    mais peut-on vérifier que c'est le thread de l'application qui envoie ce message?

    Edit:
    Je test la provenance avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TMain.ThreadFinished(var Msg: TMessage);
    var
      WParam: Cardinal;
    begin
      WParam := Msg.WParam;
      if WParam = TCleaner.Handle then
        RunParsing;
    end;
    et depuis le thread:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PostMessage(HandleMain,WM_THREAD_FINISHED, Handle, 0);
    c'est a peu près sécurisé la?

    Merci Franck SORIANO
    Il existe 3 sortes de gens: ceux qui savent compter et ceux qui ne savent pas.

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

Discussions similaires

  1. Réponses: 21
    Dernier message: 20/06/2006, 16h49
  2. fonction main en C++
    Par steph_nied dans le forum C++
    Réponses: 3
    Dernier message: 26/05/2006, 15h03
  3. arguments dans ma fonction main
    Par salseropom dans le forum C
    Réponses: 10
    Dernier message: 15/03/2006, 23h12
  4. la fonction main
    Par harvouj dans le forum Langage
    Réponses: 1
    Dernier message: 13/02/2006, 01h34
  5. Threads fonction
    Par gg2laba dans le forum C++Builder
    Réponses: 6
    Dernier message: 19/02/2005, 11h23

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