![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 27.09.2010
Сообщений: 16
|
![]()
Доброго времени суток!
Не понимаю от чего подвисание, раньше стартовал потоки таймером, а тут возникла ситуация в которой нужно именно циклы. Код конечно условный, но суть полностью отражает. Нужно запускать не больше 11 потоков одновременно, while в цикле какраз для ожидания уменьшения количества работающих потоков. форма Код:
Поток Код:
Мне так кажется происходит следующее: отрабатывают циклы, создаются потоки, после этого все потоки разом пытаются стартануть. В голову приходит синхронизация, но как? Цикл то поидее и так в главном (VCL) потоке отрабатывает. Если устроить вывод в мемо прямо из цикла то все работает как положено. Чего-то я видимо в свое время не дочитал, помогите пожалуйста разобраться. Проект прикрепляю, писалось в Delphi XE. Осторожно подвешивает машину. |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
![]()
1) замените Synchronize(incCth); и Synchronize(decCth); на InterlockedIncrement(incCth); и InterlockedDecrement(incCth); соответсвенно. Каждый лишний вызов Synchronize() — это выстрел в голову главному потоку.
2) походу, как только потоков становится > 10, ваш while дедлочит дальнейшие вызовы Synchronize(), но точно не уверен. 3) Избавьтесь вобще от Synchronize(), общайтесь с мемо через PostMessage() или с использованием одного из десятка других методов межпоточного взаимодействия.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
![]() |
![]() |
![]() |
#3 | |
Пользователь
Регистрация: 27.09.2010
Сообщений: 16
|
![]() Цитата:
|
|
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
![]()
Так, проблема хуже, чем я думал. Потоки действительно накапливаются и большинство из них запускается фактически уже после того, как программа вышла из Button1Click(), так что проверка (Cth > 10) никогда не срабатывает.
Что можно сделать? Добавить Sleep(10); после TH.Resume; Это даст шанс хоть кому-то запуститься и не насиловать систему созданием и одновременным запуском 264 потоков. Походу обнаружилось, что все потоки, основанные на TThread создаются в suspensed mode, не зависимо от параметра CreateSuspensed. Более того, если у потока FreeOnTerminate = True, то его в конце прогонят через общую критическую секцию, из-за чего потоки скапливаются на выходе. Ну а самый ужос творится внутри Synchronize(), но это и так было известно )
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Определение делегатов потоков в цикле | Lazio | C# (си шарп) | 1 | 18.07.2011 00:43 |
Запуск нескольких потоков | bulldog5293 | Общие вопросы Delphi | 3 | 11.11.2010 18:24 |
Параллельный запуск двух потоков | Sam Gold | Общие вопросы C/C++ | 0 | 30.04.2010 20:56 |
Как реализовать запуск и контроль нескольких однотипных потоков. | Son | Общие вопросы Delphi | 5 | 29.04.2010 08:40 |
Запуск потоков в цикле | VALERO | Общие вопросы Delphi | 11 | 01.03.2009 14:57 |