Sémaphore

Résolu
Caribensila
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
- 4 janv. 2008 à 22:40
offlake
Messages postés
190
Date d'inscription
mercredi 3 septembre 2008
Statut
Membre
Dernière intervention
17 janvier 2009
- 26 déc. 2008 à 10:54
Salut,

Voilà, je voudrais faire un truc pas compliqué :
Je voudrais pouvoir lancer mon application plusieurs fois. Mais pas plus qu'un nombre de fois prédéterminé (3 fois dans l'exemple ci-dessous).
Jusque là ça va, j'y arrive.
Où ça ne va plus, c'est lorsque je supprime une de ces 3 applications. Je voudrais pouvoir avoir le droit d'en relancer une nouvelle car le nombre maxi n'est plus atteint.
Mais ça le fait pas...

Voici un bout de code où j'ai condensé mon problème :

Const   NbreProcess : Integer = 3;
var      Sem : THandle;



procedure TForm1.FormCreate(Sender: TObject);
  var count : Integer;
  begin
  Sem := CreateSemaphore(nil,0,NbreProcess,'SpécialSem');
  if Sem = 0 then ShowMessage('Erreur d''ouverture du sémaphore !')
  else begin
    if not(releaseSemaphore(Sem,1,@count)) then begin
      ShowMessage('Pas plus de ' + IntToStr(NbreProcess) + ' processus !');
      Halt;
    end
    else Caption := 'Processus N° ' + IntToStr(Count+1);
    Top := Top + 32 * Count;
  end;
end;



procedure TForm1.FormDestroy(Sender: TObject);
  var Count : Integer;
  begin
  //releaseSemaphore(Sem,1,@count);// <- C'est pas bon...
  CloseHandle(Sem);
end;




procedure TForm1.btnLancerClick(Sender: TObject);
  begin
  ShellExecute(0,nil,pchar(Application.ExeName),nil,nil,SW_SHOW);
end;
---------------------------------------------------------------------

Je précise que j'aimerais bien utiliser l'API CreateSemaphore car c'est le sujet qui m'intéresse en ce moment.
Merci à toux ceux qui se pencheront sur mon 'tit problème.

Cari

9 réponses

WhiteHippo
Messages postés
1154
Date d'inscription
samedi 14 août 2004
Statut
Membre
Dernière intervention
5 avril 2012
2
5 janv. 2008 à 10:27
Bonjour

La nuit porte conseil, il y a quelquechose qui me chagrinait dans ton code, tu incrémentes toujours le compteur, mais tu ne le décrémente jamais !!! Cela doit etre effectué avec une "wait function".

Voici un bout de code qui résume tout ça.

N.B. Il me semble plus approprié de mettre ce code dans le source du projet, en effet, quel interet de créer un processus, pour après s'apercevoir que le nombre de processus est atteint et qu'il faut alors le tuer.

program Project1;



uses
  SysUtils,
  Forms,
  Windows,
  Dialogs,
  Unit1 in 'Unit1.pas' {Form1};



{$R *.res}



const
  SEMAPHORE_ALL_ACCESS = EVENT_ALL_ACCESS;
  NomSemaphore = 'SpécialSem' ;
  NbreProcess : Integer = 3;
var
  Sem : THandle;
  count : Integer;
begin
  // On essaye dans un premier temps d'ouvrir le sémaphore si celui ci a déjà été créé
  Sem := OpenSemaphore(SEMAPHORE_ALL_ACCESS,true,NomSemaphore);
  if ( Sem=0 ) then
  begin
    // Pas trouvé, donc on le crée
    ShowMessage('Première création du sémaphore !');
    Sem := CreateSemaphore(nil,0,NbreProcess,NomSemaphore);
    if Sem = 0 then
    begin
      ShowMessage('Erreur d''ouverture du sémaphore !') ;
      Halt;
    end ;
  end;



  // On vérifie le nombre de processus lancés
  if not(releaseSemaphore(Sem,1,@count)) then
  begin
    ShowMessage('Pas plus de ' + IntToStr(NbreProcess) + ' processus !');
    Halt;
  end ;



  // Limitation non atteinte
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;



  // Le fait d'utiliser WaitForSingleObject qui va permettre
  // au système de vérifier l'état du compteur du sémaphore.
  // et surtout de le décrémenter de 1 !!
  // On attend 10 ms juste histoire de ... ;)
  WaitForSingleObject (Sem, 10) ;
end.



P.S. Il n'y a pas de fermeture de handle car cela n'est normallement pas nécessaire :
"Use the CloseHandle function to close the handle. The system closes the handle automatically when the process terminates. The semaphore object is destroyed when its last handle has been closed."

Cordialement. <hr />"L'imagination est plus importante que le savoir." Albert Einstein
3