Здравствуйте, Alglib, Вы писали:
A>но какэто сделать их вашего поста не понял, какое событие и где надо ожидать?
Главное окно создается, и при этом создается объект ядра "event" в несигнальном состоянии.
HANDLE hStopEvent =
CreateEvent( NULL /*standard security attributes*/,
TRUE /*manual reset*/,
FALSE /*non-signalled initially*/,
NULL /*nameless*/);
Далее всем порождаемым потокам передается его хэндл, на котором они (потоки) периодически должны делать WaitForSingleObject() с нулевым таймаутом. Если объект в несигнальном состоянии ("можно работать"), то она вернет WAIT_TIMEOUT, если же в потоке главного окна произошло "нечто" (SetEvent(hStopEvent)), в результате чего событие установлено в сигнальное состояние, то Wait-функция вернет WAIT_OBJECT_0, что значит "событие установлено, бросай все, щас будут убивать".
Если мирное завершение потоков занимает значительное время, тот необходимо наладить обратную связь — главное окно умрет лишь после того, как все потоки доложат о завершении (либо после защитного таймаута разумной продолжительности, если возможны зависы в потоках).
Итак, имеем все окна в главном потоке, крутящем цикл сообщений, и, следовательно, всегда
реагирующий юзер-интерфейс, и рабочие потоки, поставляющие данные дочерним окнам и мониторящие на протяжении всей своей жизни стоп-событие.
Если все кажется сложным, то рекомендую написать приложение-болванку, на которой обкатать основную схему взаимодействия окон, потоков и событий. После все будет казаться ясным и логичным.