Форум: "Основная";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];
ВнизКак ожидать завершения всех 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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.042 c