Главная страница
    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.087 c
14-1090995611
menart
2004-07-28 10:20
2004.08.15
Олимпиада 2004


14-1090828203
Евгыш
2004-07-26 11:50
2004.08.15
Лицензия на Delphi для shareware программ


1-1091079593
Sancho
2004-07-29 09:39
2004.08.15
DOA 3.4.6.1 и run-time пакет


3-1090389255
leonidus
2004-07-21 09:54
2004.08.15
Вопрос по связи таблиц с последующим добавлением записей в подчин


14-1089499317
Денис
2004-07-11 02:41
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский