Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.041 c
3-1090399338
Lefan
2004-07-21 12:42
2004.08.15
Как получить список БД из BDE?


1-1090917625
Gemini
2004-07-27 12:40
2004.08.15
Глюк с атрибутами каталога


1-1091529095
V l a d i m i r
2004-08-03 14:31
2004.08.15
Поиск в предложении по комбинации букв


4-1088576047
dimon_programmer
2004-06-30 10:14
2004.08.15
Извлечение иконки


3-1089963254
dim-
2004-07-16 11:34
2004.08.15
автоматизированной радионавигационной системой дисп. упр.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский