Главная страница
    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.46 MB
Время: 0.03 c
9-1083238502
Lockdog
2004-04-29 15:35
2004.08.15
Ускоренный вывод


14-1091211885
olookin
2004-07-30 22:24
2004.08.15
Ваше мнение


3-1090299812
Tempo
2004-07-20 09:03
2004.08.15
Как узнать номер новой записи.


1-1091491749
Almaz
2004-08-03 04:09
2004.08.15
Выбор Published свойств, определенных в конкретном классе


14-1090881349
Sanek_metaller
2004-07-27 02:35
2004.08.15
Люди! Кто нибудь играл в Gothic 2 !!!!?????





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский