Здравствуйте. Разрабатываю программу, которая будет выполняться на Windows CE. В программе выполняетяс несколько потоков. Мне необходимо доождаться пока они все завершатся. В Win32 это реализуется функцией WaitForMultipleObjects с bWaitAll=TRUE, но в CE такой ключ не поддерживается. Подскажите, как можно решить проблему. Была мысль ждать функцией WaitForMultipleObjects пока не просигналит один из потоков, потом вернуть поток в несигнальное состояние. Но как можно HANDLE потока вернуть состояние, в котором он был до окончания работы потока.
Делать WaitForSingleObject для каждого потока? А если завершаться они могут не в порядке запуска? Хэндлы потоков хранятся в массиве, его удобно ждать как MultipleObjects.
Здравствуйте, AntonGr, Вы писали:
А>>ждать каждый по очереди
AG>Делать WaitForSingleObject для каждого потока? А если завершаться они могут не в порядке запуска?
Ничего страшного, хотя, конечно, я такое никогда не делал
Если Thread1 закончится раньше — пройдем первый Wait и будем ждать на втором. Если позже — будем ждать на первом, а дождавшись, тут же пройдем и второй. Хэндлы-то не закрыты, так что потоку в signaled состоянии деваться некуда. А обратно в non-signaled он перейти не может.
Неприятности возможны, когда синхрообъекты повторно используются (ивенты или семафоры). Тут разница между N WaitForSingle и одним WaitForMultiple может всю обедню испортить. Но к потокам это не относится.
With best regards
Pavel Dvorkin
Re[3]: Windows CE Threads
От:
Аноним
Дата:
01.06.09 13:10
Оценка:
AG>Делать WaitForSingleObject для каждого потока? А если завершаться они могут не в порядке запуска? Хэндлы потоков хранятся в массиве, его удобно ждать как MultipleObjects.
Ниче плохого если потоки не ждут друг друга сами еще где нить. В противном порядке просто придется скорректировать порядок ожидания всех.
Здравствуйте, AntonGr, Вы писали:
AG>Делать WaitForSingleObject для каждого потока? А если завершаться они могут не в порядке запуска? Хэндлы потоков хранятся в массиве, его удобно ждать как MultipleObjects.
Если задача именно "дождаться всех", то все равно, в каком порядке ждать. Если надо еще что-то сделать после завершения потока, и желательно не откладывая, то надо ждать через WaitForMultipleObject, пока не завешится какой-нибудь, потом выкинуть его из списка и ждать, пока не завершится какой-нибудь из оставшихся, и т.д., пока ни одного не останется.