ALGO synchronisation de processus en C++

ALGO synchronisation de processus en C++ - Programmation

Marsh Posté le 05-06-2001 à 10:41:49    

J'ai un petit prog qui en appelle un autre par le biais de la fonction CreateProcess(...)
Le premier doit "écouter" le second prog pour intercepter d'éventuelles sorties (printf ...) jusqu'à ce que le second prog se termine.
 
Mon problème est : comment faire pour que le prog appelé notifie le programme appelant ?

Reply

Marsh Posté le 05-06-2001 à 10:41:49   

Reply

Marsh Posté le 05-06-2001 à 10:45:54    

ze comprend pas ?

Reply

Marsh Posté le 05-06-2001 à 11:07:13    

Qu'est ce que tu comprends pas ?
il faudrait que le programme appelé disent au prog appelant : "youhou ! j'ai fini ! tu peux continuer !".
 
Je pourrait bien faire un printf("Exit" ) dans mon prog appelé (j'ai créé des pipes qui redirige les sorties standard du programme appelé ) mais je trouve ça un peu bourin. Quelqu'un a une solution plus propre ?

Reply

Marsh Posté le 05-06-2001 à 11:09:02    

SendMessage(j'ai fini) ?

Reply

Marsh Posté le 05-06-2001 à 11:09:54    

mmm bin en Java, ya une classe qui s'apelle InfoBus, qui permet de faire transiter des info d'une appli a une autre (une sorte de 'reseau' quoi). Ya peut etre l'equivalent en C++ ?

Reply

Marsh Posté le 05-06-2001 à 11:14:37    

[mode trés lointains souvenirs on]
heuuu... mutex et sémaphores, ça dit quelque chose à qq1. ça sert dans la synchronisation des threads... peut-être qu'en cherchant là dessus, tu trouveras des infos...
Désolé mais c'est tellement loin que je me rappelle plus...
[mode trés lointains souvenirs off]

Reply

Marsh Posté le 05-06-2001 à 11:29:15    

un truc dans ce style ? :
 
 while(statut == STILL_ACTIVE)
 {
             // traitement des sorties...
      GetExitCodeProcess(hprocess, &statut) ;
 }

Reply

Marsh Posté le 05-06-2001 à 13:32:56    

minusplus a mis dans le mille. :hot:  :gun:  
Il faut utiliser l'algorithme de Dekker ou les sémaphores de Dijkstra ou bien encore les moniteurs de Hoare (ça fait peur la théorie !!! :pt1cable:  ).
Je ne peux pas te les donner de tête (et puis même c'est trop long à expliquer :D ), mais tu dois pouvoir trouver ça sur le net.
Bonne recherche ! :hello:

 

[edit]--Message édité par DuffBeer--[/edit]

Reply

Marsh Posté le 06-06-2001 à 10:44:38    

Mais non !
Parce que le programme qui écoute il va pas se mettre en attente d'un sémaphore ou encore moins d'un mutex.
 
Le plus simple c'est d'envoyer un message (en supposant que ce programme aie un dispatcheur de message). Sinon ben une attente sur un semaphore ou un mutex d'une milliseconde en le relachant juste après, ce qui est pas beau !

Reply

Marsh Posté le 06-06-2001 à 13:13:36    

vous allez loin vous, pourtant c'est tout con
 
WaitForSingleObject, regarde la doc la dessus, ca permet en autre chose, d'effectuer de la synchro sur plein de choses dont les process crees avec CreateProcess.

Reply

Marsh Posté le 06-06-2001 à 13:13:36   

Reply

Marsh Posté le 06-06-2001 à 15:59:15    

Je lit, dans la bible du PC, :
synchronisation de processus :  
fonctions : CreateEvent, CreateMutex, CreateSemaphore() auchoix.
 
2 methodes
1) transmittion du handle de l'objet de synchronisation par heritage pere->fils
2) utilisation d'un identifiant global à tout le systeme.
 
regarde ces fonctions en detail, ca devrait t'aider.

Reply

Marsh Posté le 06-06-2001 à 16:06:45    

robUx4> En effet, je me suis tromper et je m'en excuse j'ai mal lu le pb de Moustaaki. :jap:  
wpk> Ta solution a l'air pas mal, mais je connais pas ? :??:  
oliv5> Je suivrais ton idée et j'utiliserai des signaux (SIG...)et des handlers. :sol:  
 :hello:

 

[edit]--Message édité par DuffBeer--[/edit]

Reply

Marsh Posté le 07-06-2001 à 10:45:37    

WaitForSingleObject c'est ce que tu utilises avec les sémaphores et les mutex...
 
Bref ca "prend" il faut donc ensuite "relacher". En temps-réel c'est pas terrible.
 
Sous Windows à ma connaissance il y a pas de fonction "Peek" (qui regarde si l'objet est positionné (set) ou pas). Et ca c'est BIEN dommage.

Reply

Marsh Posté le 07-06-2001 à 12:01:05    

créer un tube via la fonction pipe(), ça marcherait? et tu passerait en paramètre à ton processus créé l'adresse de ce pipe

Reply

Marsh Posté le 08-06-2001 à 10:41:44    

j'ai utilisé la fonction GetExitCodeProcess qui renvoie STILL_ACTIVE si le processus est encore actif...
Alors apparement, il y a plein de manière de faire une synchro.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed