Pracuję z wątkami i to jest powód, dla którego używam muteksów do blokowania współdzielonych zasobów. Podstawowym zastosowaniem blokowania jest umieszczenie zasobów w bloku blokowania/odblokowywania.Blokowanie i odblokowywanie zasobów za pomocą pojedynczego polecenia
procedure RefreshData;
begin
DataLock;
GetData;
GetSettings;
CheckValues;
...
DataUnlock;
end;
Ponieważ zawsze istnieje para Zablokuj/Odblokuj zacząłem myśleć o uproszczonej zablokowanie/odblokowanie podejście, które automatical odblokować zasoby, gdy nie jest już potrzebny.
Tak więc moim pomysłem było wprowadzenie nowej procedury, która jako parametr wejściowy przyjmowałaby odniesienie do precedensu. To da mi możliwość korzystania z anonimowej metody.
kod byłoby coś jak:
type TBaseProc = reference to procedure;
procedure TMyObject.LockMethod(AMeth: TBaseProc);
begin
DataLock;
try
AMeth;
finally
DataUnlock;
end;
end;
procedure TForm1.RefreshData;
begin
MyObject.LockMethod(
procedure
begin
GetData;
GetSettings;
CheckValues;
...
end;
);
end;
Ma to podejście sensu lub jest tam lepiej lub nawet łatwiejsze rozwiązanie tego?
Dzięki i pozdrawiam.
Czy zależy Ci na wydajności, czy nie? –
Najprostszym rozwiązaniem byłoby, gdyby kompilator miał natywną obsługę instrukcji Lock(), jak w C#: http://msdn.microsoft.com/en-us/library/c5kehkcz.aspx. Osobiście używam szablonów kodu dla par zablokowanych/odblokowanych. –
@ David: Tak, zależy mi na wydajności. Czy są jakieś szacunki dotyczące tego, na ile obciążenie mogłoby spowodować takie podejście? Sądzę, że para Lock/Unlock jest wciąż lepszym podejściem pod względem wydajności. – Nix