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 :
Mais quand je fais ceci, le méthode onTerminate n'est PAS appelée.
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; }
Code qui créé et lance les Threads, avec attente de serveur libre :
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 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 (.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 //--------------------------------------------------------------------------- #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
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.
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()); }
Quelqu'un pourrait-il m'aider?
Partager