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 du thread secondaire:
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 : 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;
Partager