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 et WaitForMultipleObjects


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 291
    Par défaut thread et WaitForMultipleObjects
    Bonjour

    Je n'arrive pas à utiliser la fonction WaitForMultipleObjects.

    Dans ma fiche principale j'ai ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        for ms := 1 to 12 do
        begin
          tab_thread[ms-1]:=TThreadGraphSynthese.Create(tab_ibc_qry[ms-1],nom_stored_proc,prjt,'T'+IntToStr(t),EncodeDate(an,ms,1),IncMonth(EncodeDate(an,ms,1),1));
          //recupere le handle
          tab_thread_hdl[ms-1]:=tab_thread[ms-1].Handle;
        end;
     
        //attend la fin des threads
        WaitForMultipleObjects(12,@tab_thread_hdl,TRUE,INFINITE);
    Je créé les threads récupere le handle et attend la fin

    Voici la fonction de création de mon 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
    23
    24
    25
     
    constructor TThreadGraphSynthese.Create(ibc_qry:TIBCQuery; 
    nom_stored_proc,prjt,trbn: string; dt_deb,dt_fin:TDateTime);
    begin
      //FreeOnTerminate:=TRUE;
      IbcQry:=ibc_qry;
      IbcQry.SQL.Text:='SELECT * FROM '+nom_stored_proc+'(:PRJT, :TRBN, 
    :DATE_DEB, :DATE_FIN)';
      IbcQry.ParamByName('PRJT').AsString:=prjt;
      IbcQry.ParamByName('TRBN').AsString:=trbn;
      IbcQry.ParamByName('DATE_DEB').AsDate:=dt_deb;
      IbcQry.ParamByName('DATE_FIN').AsDate:=dt_fin;
      ThreadTerminated:=FALSE;
      OnTerminate:=OnTerminateProcedure;
      Inherited Create(FALSE);
    end;
     
    procedure TThreadGraphSynthese.OnTerminateProcedure(Sender: TObject);
    begin
      ThreadTerminated:=TRUE;
    end;
    procedure TThreadGraphSynthese.Execute;
    begin
      IbcQry.Execute;
    end;
    je remarque que lorsque la fonction WaitForMultipleObjects est terminée mes
    threads ne le sont pas car si je regarde la variable ThreadTerminated elle
    est à false. Et ensuite j'ai des violations d'acces sur des variables non
    initialisées.

    Merci

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 941
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 941
    Par défaut
    Commence déjà par mettre le inherited à la première ligne du constructor.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    constructor TThreadGraphSynthese.Create(ibc_qry:TIBCQuery; 
    nom_stored_proc,prjt,trbn: string; dt_deb,dt_fin:TDateTime);
    begin
      Inherited Create(FALSE);
      ...
    end;

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 291
    Par défaut
    Bonjour,

    C'est fait. Le comportement du waitformultipleobjects est le meme

    Merci

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 941
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 941
    Par défaut
    Il n'y a rien d'autre qui me choque . WaitForMultipleObjects est correct !
    Je viens encore de faire un essai et ça fonctionne...

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 291
    Par défaut
    Ca fonctionne?

    Et bien ca alors!! Je veux bien voir le code car il doit y avoir quelque chose de different. Moi quand Waitfor... est terminé mon boolean ThreadTerminated est à false

    Amitiés

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 941
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 941
    Par défaut
    Je n'avais pas regardé ton code en entier...

    OnTerminate devrait pointer sur une méthode du thread principal et non sur une du thread secondaire. (L'appel étant Synchronize)

    Dans ton cas, il suffirait aussi simplement de mettre ThreadTerminated:=TRUE à la fin du Execute.

Discussions similaires

  1. etat d'un thread et WaitForMultipleObjects
    Par d'Oursse dans le forum Windows
    Réponses: 3
    Dernier message: 21/04/2011, 10h39
  2. [WD15] WaitForMultipleObjects dans un thread bloque mon application
    Par peijnoob dans le forum WinDev
    Réponses: 1
    Dernier message: 22/04/2010, 11h39
  3. WaitForMultipleObjects version Boost.Threads
    Par raphael_kindt dans le forum Boost
    Réponses: 1
    Dernier message: 17/09/2008, 15h35
  4. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 09h00
  5. [Kylix] Pb de Thread !!
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 25/04/2002, 13h53

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