Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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;


Наверх

Титульная страница Поиск, карта сайта Написать письмо