Salut , tout le monde , voila un problème étrange qui survient dans mon application.

En effet quand j'utilise le sémaphore la fonction synchronize ne produit aucun effet et n'affiche rien. Alors que si je commente toutes le lignes relatives au sémaphore , ça marche parfaitement.

Qu'est ce que j ai loupé ??

Code du thread Principal:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
Semaphore_Bdechargement:=CreateSemaphore(nil,1,1,'Semaphore_Bdechargement'); 
 Event_Bdechargement_init:=Tevent.create(nil,false,false,'Bdechargement_init');
 //Construction du thread
  barillet_dechargement:=TBarillet_dechargement.Create;
  //on lance le thread 
  barillet_dechargement.Resume;
  Waitforsingleobject(Semaphore_Bdechargement,infinite);
  Event_Bdechargement_init.SetEvent;
  Waitforsingleobject(Semaphore_Bdechargement,infinite);
  ReleaseSemaphore(Semaphore_Bdechargement,1,nil);
Code du thread secondaire:
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
constructor TBarillet_dechargement.Create;
begin
  FreeOnTerminate:=false;
  threadterminated:=false;
  inherited Create(true);  
  FEvent_Bdechargement_init:=Tevent.create(nil,False,False,'Bdechargement_init');
  //Ouverture du sémaphore pour déclarer la fin d'utilisation de la ressource
  FSemaphore_Bdechargement:=OpenSemaphore(SEMAPHORE_ALL_ACCESS,true,'Semaphore_Bdechargement');
end;
 
procedure Tbarillet_dechargement.Affiche_panel;
begin
 Form_pp.panel1.caption:='salut';
end;
 
procedure Tbarillet_dechargement.Execute;
begin
  while not(Threadterminated) do
  begin
    //on attend l'évenement de l'initialisation de la ressource
    if FEvent_Bdechargement_init.WaitFor(0)=wrSignaled then
    begin
      synchronize(Affiche_panel);
      //on libère le sémaphore pour signaler que la fin d'utilisation du barillet
      ReleaseSemaphore(FSemaphore_Bdechargement,1,nil);
    end;
end;