![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TCriticalSection [D7]
boba © (2008-02-26 09:47:00)В каких "не потоковых" случаях применяют TCriticalSection: например, в каких ситуациях он может понадобиться ещё?
У меня абсолютно безполезный пример ниже. Как на его работу будет сказываться TCriticalSection?
А если вместо записи в Memo, мне потребуется записывать данные в файл?
TTimerDummyClass = class(TObject)
private
FTimer: TTimer;
FOnMyTimer: TGetStrProc;
procedure _OnTimer(Sender: TObject);
public
constructor Create;
destructor Destroy;
property OnMyTimer: TGetStrProc read FOnMyTimer write FOnMyTimer;
end;
{ TTimerDummyClass }
constructor TTimerDummyClass.Create;
begin
inherited;
FTimer := TTimer.Create(nil);
with FTimer do
begin
Interval := 1000 + Random(2000);
OnTimer := _OnTimer;
Enabled := True;
end;
end;
destructor TTimerDummyClass.Destroy;
begin
FTimer.Free;
inherited;
end;
procedure TTimerDummyClass._OnTimer(Sender: TObject);
begin
if Assigned(FOnMyTimer) then
FOnMyTimer(Format('Hello! Int = %d', [TTimer(Sender).Interval]));
TTimer(Sender).Enabled := False;
end;
procedure TForm1._OnMyTimer(const S: string);
begin
CriticalSection.Enter;
Memo1.Lines.Add(S);
CriticalSection.Leave;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
CriticalSection := TCriticalSection.Create;
end;
tesseract (2008-02-26 09:52:00) [1]
> В каких "не потоковых" случаях применяют TCriticalSection:
> например, в каких ситуациях он может понадобиться ещё?
А зачем она в непотоковых ? Твой таймер должен из очереди срабатывать вообще-то.
И применяться она несколько не так :
CrtitialSection.Acquire;
try
finally
CriticalSection.Leave;
end;
Сергей М. (2008-02-26 09:51:00) [2]
> Как на его работу будет сказываться TCriticalSection?
Абсолютно никак.
Сергей М. (2008-02-26 09:50:00) [3]
> В каких "не потоковых" случаях применяют TCriticalSection
Ни в каких. Исключительно в "потоковых", причем в контексте одного и того же текущегопроцесса.
boba (2008-02-26 09:49:00) [4]Забыл:
procedure TForm1.Button1Click(Sender: TObject);
var
ClassArr: array of TTimerDummyClass;
i: Integer;
begin
SetLength(ClassArr, 10);
for i := Low(ClassArr) to High(ClassArr) do
begin
ClassArr[i] := TTimerDummyClass.Create;
ClassArr[i].OnMyTimer := _OnMyTimer;
end;
end;