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

C++Builder Discussion :

TThread et onTerminate


Sujet :

C++Builder

  1. #1
    Membre éclairé Avatar de sylvain.cool
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 242
    Par défaut TThread et onTerminate
    Bonjour,

    J'utilise des threads afin de lancer des calculs sur des serveurs.

    Quand je fais ceci, à la fin du thread, la fonction associé à onTerminate est appelée.

    Code qui créé et lance les Threads, sans attente de serveur libre :
    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
    TCOMIGestionnaireCOM gestionnaire = CoGestionnaireCOM::CreateRemote(ADDR_GESTIONNAIRE);
    WideString serverAddr = "";
     
    gestionnaire->askServerAddress(&serverAddr);	
    if(serverAddr != "")
    {   
    	TPlatform *platform;
    	platform = TPlatform::getInstance();
    	AnsiString technicName = TECHNIC_NAME_PREFIX + platform->getCurrentPluginOption();
     
    	remoteProcessThread = new RemoteProcessThread(true);  
    	remoteProcessThread->setRemoteParameter(imageData, processData, processParameter, technicName, serverAddr);
    	remoteProcessThread->Resume();
    	res = true;
    }
    Mais quand je fais ceci, le méthode onTerminate n'est PAS appelée.

    Code qui créé et lance les Threads, avec attente de serveur libre :
    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
    TCOMIGestionnaireCOM gestionnaire = CoGestionnaireCOM::CreateRemote(ADDR_GESTIONNAIRE);
    WideString serverAddr = "";
     
    while(serverAddr == "")
    { 
    	reponse = gestionnaire->askServerAddress(&serverAddr);
    	analyseReponse(reponse, "gestionnaire->askServerAddress");	
    	if(serverAddr != "")
    	{   
    		TPlatform *platform;
    		platform = TPlatform::getInstance();
    		AnsiString technicName = TECHNIC_NAME_PREFIX + platform->getCurrentPluginOption();
     
    		remoteProcessThread = new RemoteProcessThread(true);  
    		remoteProcessThread->setRemoteParameter(imageData, processData, processParameter, technicName, serverAddr);
    		remoteProcessThread->Resume();
    		res = true;
    	}
    	else
    	{
    		Sleep(1000);
    	}
    }
    Code du thread (.h) :
    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
    //---------------------------------------------------------------------------
     
    #ifndef RemoteProcessThreadH
    #define RemoteProcessThreadH
    //---------------------------------------------------------------------------
    #include <Classes.hpp>  
    #include "RemoteTechnic.h"
    #include "JobDispatcher_TLB.h"
    //---------------------------------------------------------------------------
    class RemoteProcessThread : public TThread
    {
    private: 
    	RemoteTechnic remoteTechnic; 
    	TImageData imageData; 
    	IProcessData *processData; 
    	IProcessParameter *processParameter; 
    	AnsiString technicName;
    	AnsiString serverAddr;
     
    protected:
    	void __fastcall Execute();
    public:
    	__fastcall RemoteProcessThread(bool CreateSuspended);
     
    	RemoteTechnic* getRemoteTechnic();
     
    	void setRemoteParameter(TImageData *imageData, 
    							IProcessData *processData, 
    							IProcessParameter *processParameter,
    							AnsiString technicName,
    							AnsiString serverAddr);
     
    	void __fastcall releaseServer(TObject *Sender);								
    };
    //---------------------------------------------------------------------------
    #endif
    Code du Thread (.cpp) :
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    //---------------------------------------------------------------------------
     
    #include <vcl.h>
    #pragma hdrstop
     
    #include "RemoteProcessThread.h"
    #pragma package(smart_init)
    //---------------------------------------------------------------------------
     
    // Important : les méthodes et les propriétés des objets de la CVL peuvent uniquement
    // être utilisées dans une méthode appelée en utilisant Synchronize, comme suit :
    //
    //      Synchronize(&UpdateCaption);
    //
    // où UpdateCaption serait de la forme :
    //
    //      void __fastcall RemoteProcessThread::UpdateCaption()
    //      {
    //        Form1->Caption = "Mis à jour dans un thread";
    //      }
    //---------------------------------------------------------------------------
     
    __fastcall RemoteProcessThread::RemoteProcessThread(bool CreateSuspended)
    	: TThread(CreateSuspended)
    { 
    	CoInitializeEx(NULL, COINIT_MULTITHREADED);
     
    	this->OnTerminate = releaseServer;
    }
    //---------------------------------------------------------------------------
    void __fastcall RemoteProcessThread::Execute()
    {
    	//---- Placer le code du thread ici ----
    	remoteTechnic.remoteRun(imageData, processData, processParameter, technicName, serverAddr);
    }
    //---------------------------------------------------------------------------
     
    RemoteTechnic* RemoteProcessThread::getRemoteTechnic()
    {
    	return &remoteTechnic;
    }
     
    void RemoteProcessThread::setRemoteParameter(TImageData *imageData, 
    											IProcessData *processData, 
    											IProcessParameter *processParameter,
    											AnsiString technicName,
    											AnsiString serverAddr)
    {  
    	this->imageData = *imageData;
    	this->processData = processData;
    	this->processParameter = processParameter;
    	this->technicName = technicName;  
    	this->serverAddr = serverAddr;
    }
     
    void __fastcall  RemoteProcessThread::releaseServer(TObject *Sender)
    {
    	WideString serverToRelease = serverAddr;
     
    	TCOMIGestionnaireCOM gestionnaire = CoGestionnaireCOM::CreateRemote(ADDR_GESTIONNAIRE);
    	gestionnaire->releaseServer(serverToRelease.c_bstr());
    }
    Utilisant la même class dans les 2 cas, je ne comprend pas pourquoi la fonction onTerminate est appelée dans un cas et pas dans l'autre.

    Quelqu'un pourrait-il m'aider?

  2. #2
    Membre éclairé Avatar de sylvain.cool
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 242
    Par défaut
    Bon ben... j'ai pas compris comment résoudre réellement le problème, ni d'où il vient, mais je l'ai détourné.

    Au lieu de lié la fonction à onTerminate, je l'appelle à la fin de Execute.

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

Discussions similaires

  1. [TThread] Problème avec l'évènement OnTerminate
    Par coax81 dans le forum Langage
    Réponses: 12
    Dernier message: 05/11/2007, 14h05
  2. TThread et execl
    Par sebpatu dans le forum C++Builder
    Réponses: 2
    Dernier message: 17/11/2003, 00h02
  3. TThread et waitfor - descripteur non valide
    Par code34 dans le forum Langage
    Réponses: 2
    Dernier message: 27/10/2003, 23h44
  4. TThread: probleme de recuperation du Handle
    Par code34 dans le forum Langage
    Réponses: 8
    Dernier message: 07/09/2003, 03h04
  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