| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Как узнать, что TThread отработал |
| Автор: MadCoder 12.6.2008, 15:45 |
| Здравствуйте! Моя программа создает некоторое количество потоков (50 и более). Как программа может узнать, что код потоков отработал и можно продолжать другие действия. |
| Автор: Poseidon 12.6.2008, 15:50 |
| Все зависет от того, как у тебя создаются и завершаются потоки. Можно периодично assigned проверять, можно в конце потока передавать "я завершаюсь" в основной (или в "проверяющий") поток. Тут на что фантазии хватит. |
| Автор: Rrader 12.6.2008, 15:55 |
| WaitForMultipleObjects? |
| Автор: Alexeis 12.6.2008, 16:04 |
| MadCoder, у TThread есть функция waitfor т.е. можно поджать завершения, а можно создать семафор, по выходу счетчик автоматом будет уменьшаться. |
| Автор: MetalFan 12.6.2008, 20:00 | ||
сорь, о чем речь? ) по выходу из чего и как это автоматом? |
| Автор: Alexeis 12.6.2008, 20:09 |
Перед стартом всех потоков нужно сигнализировать его нужное количество раз, а по выходу из потока занимать. Использовать как счетчик. |
| Автор: MadCoder 12.6.2008, 21:00 | ||||||
Т.е. так:
а в процедуре Execute потока писать:
? |
| Автор: MetalFan 12.6.2008, 21:01 |
| Alexeis, ну да, собстно в http://msdn.microsoft.com/en-us/library/ms686946.aspx есть хороший пример по этому поводуь |
| Автор: MadCoder 12.6.2008, 21:06 |
| MetalFan, можешь написать примерчик на Делфи, очень надо, пожаааалуйста |
| Автор: MetalFan 12.6.2008, 21:24 |
| а что не понятно в примере из msdn? |
| Автор: Exai1e 12.6.2008, 21:33 |
| MetalFan, мб синтаксис и "неизвестные" операторы ?) ;) |
| Автор: Rennigth 15.6.2008, 00:42 |
| хм, забыли про OnTerminated |
| Автор: MadCoder 20.6.2008, 14:18 | ||||
Точно! Значит поток Terminate, в функции OnTerminated уменьшаем счетчик и в главном коде ставим:
Все ясно! Спасибо |
| Автор: CodeMonkey 26.6.2008, 10:43 |
| P.S. Вообще-то это не даст выполняться Synchronize и вообще цикл будет постоянно крутиться (хотя, возможно что в вашей ситуации это не важно). Я бы использовал HandleMessage и после уменьшения счётчика пробуждал бы главный поток отправкой WM_NULL. |
| Автор: MadCoder 3.7.2008, 10:56 | ||
Так? |
| Автор: MadCoder 6.7.2008, 00:10 |
| Не работает |
| Автор: Rrader 6.7.2008, 07:13 | ||||
Однако данная функция очень удобна и атомарна в своих действиях, поэтому я бы сделал несколько серий ожиданий. |
| Автор: MadCoder 8.7.2008, 14:26 |
| Сделал копи-паст полный, скомпилировал, запускаю, пишет: "Параметр задан неверно" и "Неверный дескриптор". |
| Автор: Rennigth 8.7.2008, 14:58 | ||
| MadCoder, Успевали первые треды завершиться до вызова W@aitForMultipleObjects. Если переделать примерно так, то работает.
|
| Автор: Rrader 8.7.2008, 15:06 |
| Ага, нашел ошибку. Из-за FreeOnTerminate |
| Автор: MadCoder 8.7.2008, 16:51 |
| Спасибо, супер |
| Автор: Rrader 8.7.2008, 17:21 |
| MadCoder, в таком случае, чтобы без FreeOnTerminate работать, заведи еще и массив потоков. Создавай их так же, но в конце удаляй (Free). Иначе получаешь утечку памяти...неслабую |