Bonjour,
J'ai un problème qui est à priori assez simple mais que je n'arrive pas à résoudre.

Ca se passe sous windows en c++ builder mais le pb n'est pas spécifique à builder.

J'ai un Processus principale qui lance un autre processus. Ce 2ème processus lance un 3ème processus et quitte immédiatement.

J'aimerais pouvoir faire en sorte que mon processus principale attende la fin du 3ème processus pour poursuivre son execution.
Comment dois-je faire ?

Actuellement j'ai dans mon processus principale ceci :

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
 
// Création du mutex
HANDLE hMutexFrontReplica = CreateMutex(NULL,FALSE,"REPLICA_FRONT_MUTEX");
 
// Lancement du 2ème processus
STARTUPINFO startupInfo;
PROCESS_INFORMATION procInfo;
memset(&startupInfo, 0, sizeof(STARTUPINFO));
memset(&procInfo, 0, sizeof(PROCESS_INFORMATION));
startupInfo.cb = sizeof(STARTUPINFO);
startupInfo.lpReserved = NULL;
startupInfo.dwFlags = STARTF_USESHOWWINDOW;
startupInfo.wShowWindow = SW_SHOWNORMAL;
 
CreateProcess( NULL,
                "processus2.exe",
                NULL,
                NULL,
                FALSE,
                NORMAL_PRIORITY_CLASS,
                NULL,
                NULL,
                &startupInfo,
                &procInfo);
 
// J'attends la fin du 2eme processus
WaitForSingleObject(procInfo.hProcess,INFINITE)
 
// J'attends la fin du 3eme processus
if(hMutexFrontReplica)
    WaitForSingleObject(hMutexFrontReplica,INFINITE);
Dans mon 2eme processus :

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
 
HANDLE handle = OpenMutex(MUTEX_ALL_ACCESS,TRUE,"REPLICA_FRONT_MUTEX");
// Passage en état non signalé
if(handle){
  HRESULT hr = WaitForSingleObject(handle,INFINITE);
}
// Création du 3eme processus
STARTUPINFO startupInfo;
PROCESS_INFORMATION procInfo;
memset(&startupInfo, 0, sizeof(STARTUPINFO));
memset(&procInfo, 0, sizeof(PROCESS_INFORMATION));
startupInfo.cb = sizeof(STARTUPINFO);
startupInfo.lpReserved = NULL;
startupInfo.dwFlags = STARTF_USESHOWWINDOW;
startupInfo.wShowWindow = SW_SHOWNORMAL;
 
CreateProcess( NULL,
                "processus3.exe",
                NULL,
                NULL,
                FALSE,
                NORMAL_PRIORITY_CLASS,
                NULL,
                NULL,
                &startupInfo,
                &procInfo);
Dans le 3ème processus :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
HANDLE handle = OpenMutex(MUTEX_ALL_ACCESS,FALSE,"REPLICA_FRONT_MUTEX");
if(handle != NULL){
  ReleaseMutex(handle);
}