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?