Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.15;
Скачать: CL | DM;

Вниз

Как ожидать завершения всех TThread ?   Найти похожие ветки 

 
mr.Tim   (2004-08-02 17:52) [0]

Исходник см. ниже.

 Из гл. формы запускается много тредов.
 Нужно дождаться пока они все отработают (соберут необходимую информацию).
 И затем произвести действия над собранной инфой.
 Затем цикл повторяется.

 Чтобы узнать все ли треды отработали, в гл. форме заведена переменная vThreadCount.
 Каждый тред увеличивает ее на 1 при создании, и уменьшает на 1 при закрытии.
 Также в гл. форме объявлен
   vEvent : TEvent.

 И последний из выполняющихся тредов выполняет:
   vEvent.SetEvent.

 Однако в основной форме ожидание типа описанного в хелпе:
 
 if Event1.WaitFor(20000) <> wrSignaled then ...
 
 порождает "заморозку" проги, что неприемлемо.
 Поэтому все организовано как в procedure TfmMain.myMainProc;

 Правильна ли такая работа с тредами? Не криво ли?

 p.s. Про исп-е TCriticalSection прочитано в хелпе.

--------- модуль с тредом -------------

type
 TactiveThread = class(TThread)
 private
   { Private declarations }
 protected
   CounterGuard : TCriticalSection;
   procedure Execute; override;
   procedure DoTerminate; override;
 public
   constructor Create(CreateSuspennded: Boolean; const aIp : string);
 end;

constructor TactiveThread.Create(CreateSuspennded: Boolean);
begin
 FreeOnTerminate := True;
 inherited Create(CreateSuspennded);
 CounterGuard := TCriticalSection.Create;
 CounterGuard.Acquire;
 inc(fmMain.vThreadCount); // общий счетчик тредов, объявленный в главной форме
 CounterGuard.Release;
end;

procedure TactiveThread.DoTerminate;
begin
 CounterGuard.Acquire;
 dec(fmMain.vThreadCount); // общий счетчик тредов, объявленный в главной форме
 if fmMain.vThreadCount <= 0 then fmMain.vEvent.SetEvent;
 CounterGuard.Release;
 CounterGuard.Free;
end;

------------------------------------

--------- главный модуль -----------

type
 TfmMain = class(TForm)
   ...
 public
   vEvent : TEvent;
   vThreadCount : integer; // счетчик тредов (каждый тред увеличивает его на 1 при создании
                           // и уменьшает на 1 при закрытии)
   ...
   procedure myProc;
   procedure myMainProc;
 end;

procedure TfmMain.myProc;
var
 myThread : TactiveThread;
begin
 if vThreadCount > 0 then Exit; // не все предыдущие треды завершены
 vThreadCount := 0; // счетчик тредов
 vEvent.ResetEvent; { clear the event before launching the threads }
 for ...
   ...
   myThread := TactiveThread.Create(false);
 end; {for}
 ...
 myMainProc;
end;

procedure TfmMain.myMainProc;
begin
 ...
 // ждем завершения всех тредов (в msec)
 while vEvent.WaitFor(1) = wrTimeout do begin
   Sleep(50); // чтобы не грузить ЦП на 100%
   Application.ProcessMessages;
 end;
 ...
end;

------------------------------------


 
Игорь Шевченко ©   (2004-08-02 18:11) [1]


> Как ожидать завершения всех TThread ?


http://www.schevchenko.net.ru/SRC/SuperMarket_50.zip ?



Страницы: 1 вся ветка

Текущий архив: 2004.08.15;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.028 c
14-1090964671
i-s-v
2004-07-28 01:44
2004.08.15
DirectX


3-1090551019
aaa_loto
2004-07-23 06:50
2004.08.15
Запрос


1-1090772137
parovoZZ
2004-07-25 20:15
2004.08.15
Открытие файла


11-1079078787
Mitka
2004-03-12 11:06
2004.08.15
Можно в StatusBar(KOL) добавить кнопку?


1-1091221698
Ivanov
2004-07-31 01:08
2004.08.15
Как сделать"вкладку"