Подскажите, как решить вот такую проблемму:
В компоненте создаю несколько рабочих потоков. Потом при окончании работы компонента где лучше ожидать завершения работы потоков ?
Как вообще правильно надо работать с потоками в компоненте?
Здравствуйте Serge, Вы писали:
S>Всем привет!
S>Подскажите, как решить вот такую проблемму: S>В компоненте создаю несколько рабочих потоков. Потом при окончании работы компонента где лучше ожидать завершения работы потоков ? S>Как вообще правильно надо работать с потоками в компоненте?
Вариантов много, все зависит от того что делают потоки.
Ну можно в FinalRelease(...)
Здравствуйте OlegO, Вы писали:
OO>Здравствуйте Serge, Вы писали:
S>>Всем привет!
S>>Подскажите, как решить вот такую проблемму: S>>В компоненте создаю несколько рабочих потоков. Потом при окончании работы компонента где лучше ожидать завершения работы потоков ? S>>Как вообще правильно надо работать с потоками в компоненте?
OO>Вариантов много, все зависит от того что делают потоки. OO>Ну можно в FinalRelease(...)
Потоки работают с serial-портами и возможны ситуации когда они будут заблокированы на пару секунд. Как в таком случае ожидать их завершения?
Re[3]: Куда прикрутить Thread-ы ??
От:
Аноним
Дата:
26.10.01 08:35
Оценка:
Здравствуйте Serge, Вы писали:
S>Здравствуйте OlegO, Вы писали:
OO>>Здравствуйте Serge, Вы писали:
S>>>Всем привет!
S>>>Подскажите, как решить вот такую проблемму: S>>>В компоненте создаю несколько рабочих потоков. Потом при окончании работы компонента где лучше ожидать завершения работы потоков ? S>>>Как вообще правильно надо работать с потоками в компоненте?
OO>>Вариантов много, все зависит от того что делают потоки. OO>>Ну можно в FinalRelease(...)
S>Потоки работают с serial-портами и возможны ситуации когда они будут заблокированы на пару секунд. Как в таком случае ожидать их завершения?
WaitForSingleObject или WaitForMultipleObjects
Смотри в MSDN
The WaitForSingleObject function returns when one of the following occurs:
— The specified object is in the signaled state.
— The time-out interval elapses.
The WaitForMultipleObjects function returns when one of the following occurs:
— Either any one or all of the specified objects are in the signaled state.
— The time-out interval elapses.
А>WaitForSingleObject или WaitForMultipleObjects А>Смотри в MSDN
А>The WaitForSingleObject function returns when one of the following occurs: А>- The specified object is in the signaled state. А>- The time-out interval elapses.
А>The WaitForMultipleObjects function returns when one of the following occurs: А>- Either any one or all of the specified objects are in the signaled state. А>- The time-out interval elapses.
Спасибо, но вопрос в том, не как, а ГДЕ в компоненте ожидать их завершения.
Здравствуйте Serge, Вы писали:
S>Здравствуйте Аноним, Вы писали:
А>>WaitForSingleObject или WaitForMultipleObjects А>>Смотри в MSDN
А>>The WaitForSingleObject function returns when one of the following occurs: А>>- The specified object is in the signaled state. А>>- The time-out interval elapses.
А>>The WaitForMultipleObjects function returns when one of the following occurs: А>>- Either any one or all of the specified objects are in the signaled state. А>>- The time-out interval elapses.
S>Спасибо, но вопрос в том, не как, а ГДЕ в компоненте ожидать их завершения.
Ну так в FinalRelease и перед тем как сделать delete this, поставь ожидание одной из выше перечисленных функций.
Здравствуйте Serge, Вы писали:
S>Здравствуйте SergeyAksuchenko, Вы писали:
SA>>Здравствуйте Serge, Вы писали:
SA>>Ну так в FinalRelease и перед тем как сделать delete this, поставь ожидание одной из выше перечисленных функций.
S>А зачем в FinalRelease делать delete this ???
Самому этого делать не нужно.
Это реализованно в классах ATL(очень полезно в них покапаться для большего понимания).
А FinalRelease вызываются из Release(хотя возможны и другие реализации) когда ReferenceCounter достигает нуля, т.е. данный объект никто не использует и его следует уничтожить(освободить память).
Таким образом объект сам себя уничтожает, если на него нет больше ссылок.
Есть еще замечательные грабли. :) Сами месяц назад по ним прошлись. :(
Если быстро создать основной объект и сразу же его уничтожить, а именно это и делает подлый VB6 при компиляции проекта), то в ФайналРелиз придет еще не созданная нитка. Вернее нитка будет создана после и данные переданные туда будут грязью. Так что нужно принять меры к тому, чтобы ФайналРелиз не вызывался до полного завершения создания нитки. Это когда нитка считает переданный ей параметр.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте VladD2, Вы писали:
VD>Здравствуйте Serge, Вы писали:
S>>Спасибо всем.
VD>Есть еще замечательные грабли. :) Сами месяц назад по ним прошлись. :(
VD>Если быстро создать основной объект и сразу же его уничтожить, а именно это и делает подлый VB6 при компиляции проекта), то в ФайналРелиз придет еще не созданная нитка. Вернее нитка будет создана после и данные переданные туда будут грязью. Так что нужно принять меры к тому, чтобы ФайналРелиз не вызывался до полного завершения создания нитки. Это когда нитка считает переданный ей параметр.
Гы. Типичный Race однако.Таких граблей можно море себе насоздавать. :)