Главная страница
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.041 c
8-1085741333
Musiy
2004-05-28 14:48
2004.08.15
Полупрзрачность


14-1090788390
parovoZZ
2004-07-26 00:46
2004.08.15
Не работает в оепере


1-1091088781
AlexXn
2004-07-29 12:13
2004.08.15
Добавление элемента в отсортированный массив


1-1091106155
Aleksandr.
2004-07-29 17:02
2004.08.15
Чем Abort внутри метода потока отличится от Terminate?


14-1090990707
syte_ser78
2004-07-28 08:58
2004.08.15
Помогите, а то достало уже!!!!