Re[7]: Потоки в ДЛЛ, когда надо их прибивать?
От: Игорь Вартанов Ниоткуда  
Дата: 25.03.03 11:42
Оценка:
Здравствуйте, 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, что значит "событие установлено, бросай все, щас будут убивать".

Если мирное завершение потоков занимает значительное время, тот необходимо наладить обратную связь — главное окно умрет лишь после того, как все потоки доложат о завершении (либо после защитного таймаута разумной продолжительности, если возможны зависы в потоках).

Итак, имеем все окна в главном потоке, крутящем цикл сообщений, и, следовательно, всегда реагирующий юзер-интерфейс, и рабочие потоки, поставляющие данные дочерним окнам и мониторящие на протяжении всей своей жизни стоп-событие.

Если все кажется сложным, то рекомендую написать приложение-болванку, на которой обкатать основную схему взаимодействия окон, потоков и событий. После все будет казаться ясным и логичным.
---
С уважением,
Игорь
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.