stigmate101
Messages postés89Date d'inscriptionmardi 17 juin 2003StatutMembreDernière intervention30 avril 2020
-
28 juil. 2003 à 11:26
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 2013
-
8 août 2003 à 01:46
Salut à tous,
Il faut que j’apprenne à utiliser les sémaphores. Sous Delphi5
Le problème c’est que je n’ai pas trouvé de sources, ni de tutorial, etc…
stigmate101
Messages postés89Date d'inscriptionmardi 17 juin 2003StatutMembreDernière intervention30 avril 2020 4 août 2003 à 14:34
Salut,
J'essage d'utiliser un semaphore pour gérer l'accès à d'un fichiers par plusieur programme le problème c'est que le n'arrive pas à faire fonctionner mon code.
Ce code doit être utilisé dans plusieurs applications. Le problème c'est que j'arrive à prendre le semaphore même quand je ne devrais pas pouvoir.
Merci à tous
///////////////////////// Debut Code ///////////////////
unit Unit1;
procedure TForm1.FormCreate(Sender: TObject);
begin
Sem:=CreateSemaphore(nil,0,1,'Sem.Delphi5');
// Créer et nome un objet Sémaphore (Pointer to security Attributes,Valeur initiale compteur,Valeur maximale compteur,Pointeur de l'objet Semaphore)
if Sem=0 then
begin
ShowMessage('Erreur d''ouverture du Semaphore');
end
else
begin
if GetLastError=ERROR_ALREADY_EXISTS then
begin
ShowMessage('on est pas le premier');
end
else
begin
ShowMessage('Le Semaphore est en place (0/1)');
end;
end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
CloseHandle(Sem);
end;
procedure TForm1.RendreSemaphore();
var Count:integer;
begin
if ReleaseSemaphore(Sem,1,@Count) then
// Augmentation Semaphore (Objet, Hausse, Compteur)
ShowMessage(IntTostr(Count+1)+' accès sur 1 possibles')
else
ShowMessage('Rien à libérer');
end;
procedure TForm1.PrendreSemaphore();
var lpMsgBuf:LPVOID;
//var LPVOID:lpMsgBuf;
begin
if WaitForSingleObject(Sem,1000)= WAIT_FAILED Then;
begin
ShowMessage('Le semaphore n''a pas été pris')
end;
end;
procedure TForm1.PrendreClick(Sender: TObject);
begin
PrendreSemaphore();
end;
procedure TForm1.RendreClick(Sender: TObject);
begin
RendreSemaphore();
end;
end.
////////////////////// Fin code /////////////////////////
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 8 août 2003 à 01:46
Ce code est apparemment issu du livre "Delphi 7 studio", non ?
Enfin, je suis étonné des valeurs transmises à CreateSemaphore, notamment au niveau du deuxième paramètre. Si tu crées un semaphore en mettant InitialCount à 0, alors chaque programme ne crée aucun semaphore au démarrage :
Sem:= CreateSemaphore(nil,0,1,'Sem.Delphi5');
Rappel : le deuxième paramètre représente le nombre initial de semaphore créés, le troisième le nombre maximum de semaphores.
May Delphi be with you