Chciałbym się zapytać czy poniższy kod który ma służyć rezerwacji progressbara jest poprawny. Czyli. Kilka wątków używa tego samego progressbara ale tylko jeden może go używać w tym samym czasie.
var
Gauge_Busy : Boolean = False;
Gauge_SetReservationOn: Boolean = False;
rGauge : TrGauge;
{ Zwalnia dostęp do progress bara }
procedure TrGauge.EndReservation;
begin
Gauge_Busy := False;
end;
{ Rezerwuje dostęp do gauge, jesli true to kolejne wywołanie zwróci false }
function TrGauge.Reservation: boolean;
begin
Result := False;
if Gauge_SetReservationOn then
Exit;
Gauge_SetReservationOn := True;
if not Gauge_Busy then
begin
Gauge_Busy := True;
Result := True;
end;
Gauge_SetReservationOn := False;
end;
A tu jak watki uzyskują dostęp do progress bara lub gauge;
procedure TTHread.Execute;
begin
while not Terminated do
begin
WaitForSingleObject(hEvent, INFINITE);
if Terminated then
Exit;
{ Zarezerwój gauge }
while not rGauge.Reservation do
begin
sleep(100); // Czekaj tak długo aż progressbar sie zwolni
if Terminated then
Exit;
end;
{ I teoretycznie od tego momentu mozemy używać progressbara majac pewność że nikt inny nam tego nie zajmie bo
rGauge.Reservation zawsze zwróci False; }
rGauge.EndReservation; //Zwolnij progressbar;
end;
end;
I teraz pytanie czy ten sposób jest bezpieczny i prawidłowy. Pytam się gdyż natrafiłem w swojej aplikacji na błędy i czasami mogę być spowodowane tym że 2 wątki chcę w tym samym czasie korzystać z progresbara.