Semaphore

stigmate101 Messages postés 89 Date d'inscription mardi 17 juin 2003 Statut Membre Dernière intervention 30 avril 2020 - 28 juil. 2003 à 11:26
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Derniè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…

Quelqu’un pourrait-il me venir en aide.

Merci d’avance
A+

3 réponses

cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
28 juil. 2003 à 13:49
Il existe de nombreux articles sur le net à ce sujet. Un bon point de départ se situe à la source, c'est à dire sur le Borland Developers's Network.
May Delphi be with you
0
stigmate101 Messages postés 89 Date d'inscription mardi 17 juin 2003 Statut Membre Dernière intervention 30 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;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Prendre: TButton;
Rendre: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure PrendreClick(Sender: TObject);
procedure RendreClick(Sender: TObject);
procedure RendreSemaphore();
procedure PrendreSemaphore();

private
{ Déclarations privées }
Sem:THandle;
public
{ Déclarations publiques }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

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 /////////////////////////
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
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
0
Rejoignez-nous