| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > TThread + WaitForMultipleObjects |
| Автор: Dom 6.11.2009, 13:33 | ||
| Столкнулся с тем что не могу понять как работает WaitForMultipleObjects. А может дело и не в нем. Есть такой пример, большая часть кода позаимствована http://forum.vingrad.ru/index.php?showtopic=216315&view=findpost&p=1573798
Так вот процедура btn2Click отрабатывает как и предполагается, а вот btn1Click выдает ошибку "Неверный дескриптор". 1) Почему не получается обработать массив хэндлов произвольного размера, т.е. фактически произвольно задавать число создаваемых потоков? 2) Если после нажатия на btn2, пока не успели завершится все потоки, нажать на btn1, то выводимое значение А будет 50, т.е. отрабатывают только 50 потоков. Т.е. получается, что массивы Handles хоть и объявляются в каждой процедуре локально, но взаимосвязаны? Почему так? Пробовал переименовывать эти массивы, результат тот же. Чувствую что истина где-то рядом... Помогите пожалуйста. |
| Автор: CodeMonkey 6.11.2009, 16:00 |
| Чему, по-вашему, равно @Handles для http://transl-gunsmoker.blogspot.com/2009/09/blog-post.html#references? |
| Автор: Демо 6.11.2009, 22:29 |
| Если хочешь использовать функции WaitFor..., то FreeOnTerminate := False. Только не забывай для своих классов-потоков выполнять Free; |
| Автор: Dom 6.11.2009, 23:56 |
| CodeMonkey, спасибо за ссылки! С хэндлами, точнее с динамическим массивом разобрался. А вот с WaitFor это уже на свежую голову... Только почему же в оригинальном примере FreeOnTerminate := True Ладно, это уже завтра. |
| Автор: Dom 7.11.2009, 15:25 |
| Так вот, возвращаясь к напечатанному. По поводу WaitFor... FreeOnTerminate := False надо ставить, чтобы просто наверняка исключить ситуацию, когда поток завершится раньше вызова WaitFor... или с какой-то иной целью? |
| Автор: Демо 8.11.2009, 04:12 | ||
С FreeOnTerminate=True ситуация следующая: При завершении поточной поточной функции в основном потоке немедленно происходит освобождение TThread. Причём происходит оно раньше, чем начинает выполняться WaitFor. Поэтому при ожидании завершения выполнения поточной функции нужно обязательно ставить FreeOnTerminate=False. |
| Автор: Akella 8.11.2009, 10:59 |
| Вот рабочий пример http://forum.vingrad.ru/index.php?showtopic=278503&view=findpost&p=2015045 |
| Автор: Dom 9.11.2009, 23:53 |
| Спасибо всем за помощь! Собрал еще одну тестовую программку. Работает как и задумывалось, что не может не радовать. Можно сказать основы усвоил. Теперь дело за малым - переписать старую прогу под многопоточность. |