Я работаю с потоками, и именно поэтому я использую мьютексы для блокировки общих ресурсов. Базовое использование блокировки заключается в размещении ресурсов в блоке блокировки/разблокировки.Блокировка и разблокировка ресурсов с помощью одной команды
procedure RefreshData;
begin
DataLock;
GetData;
GetSettings;
CheckValues;
...
DataUnlock;
end;
Потому что всегда есть пара блокировки/разблокировки Я начал думать об упрощенной блокировке/разблокировка подхода, который бы автообновление разблокировать ресурсы, когда больше не нужно.
Итак, моя идея состояла в том, чтобы ввести новую процедуру, которая будет принимать в качестве входного параметра ссылку на прецедент. Это даст мне возможность использовать анонимный метод.
Код будет что-то вроде:
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;
Имеет такой подход какой-то смысл или есть лучше, или даже проще решение этой проблемы?
Спасибо и приветствую.
Вы заботитесь о производительности или нет? –
Простейшим решением было бы, если бы у компилятора была встроенная поддержка оператора Lock(), как в C#: http://msdn.microsoft.com/en-us/library/c5kehkcz.aspx. Лично я использую шаблоны кода для пар блокировки/разблокировки. –
@ Давид: Да, я забочусь о производительности. Есть ли какая-либо оценка того, сколько накладных расходов может вызвать такой подход? Я думаю, что пара Lock/Unlock по-прежнему лучше подходит с точки зрения производительности. – Nix