![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Потокобезопасный класс [D5, Win2k]
Fktrc © (2004-11-25 06:09:00)Реализую сабж следующим образом:
TSafeThread = class
private
fCriticalSection: TRTLCriticalSection;
fField1: Integer;
fField2: String;
fField3: TextFile;
function GetField1: Integer;
procedure SetField1 (NewField: Integer);
function GetField2: String;
procedure SetField2 (const NewField: String);
public
property Field1: Integer read GetField1 write SetField1;
property Field2: String read GetField2 write SetField2;
procedure Method1;
function Method2;
constructor Create ();
destructor Destroy; override;
end; {TSafeThread}
причем
1. в public секции только свойства и методы (никаких переменных)
2. тела абсолютно всех методов класса реализованы вот так:
begin
EnterCriticalSection ( fCriticalSection);
try
bla;
bla;
finally
LeaveCriticalSection ( fCriticalSection);
end;
end;
Имеют ли Мастера что-л сказать? Действительно ли такой класс (объект которого создается в одном потоке и используется всеми остальными) будет потокобезопасным или я что-то упустил?
Fktrc (2004-11-25 12:51:00) [1]2SVM (Perm)
Почему? Если в конструкторе использовать InitializeCriticalSection(fCriticalSection), то по-моему у каждого экземпляра класса будет своя секция, не пересекающаяся с секциями других экземпляров.
SVM (Perm) (2004-11-25 09:45:00) [2]CriticalSection - одна для всеx экземпляров.
Fktrc (2004-11-25 08:28:00) [3]OK, спасибо. Упустил из виду.
Digitman (2004-11-25 08:01:00) [4]
> или я что-то упустил?
не забудь и про использование КС в деструкторе, это ведь тоже метод
EnterCriticalSection (fCriticalSection);
try
...
inherited;
finally
LeaveCriticalSection (fCriticalSection);
DeleteCriticalSection (fCriticalSection);
end;