![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Подвисание... [D7, WinXP]
Bes © (2003-09-11 01:06:00)
Вообщем я содаю 25 потоков с одинаковыми действиями, но разными входными параметрами...
все нормально работает, но вот только программа моя подвисает пока потоки работают...
я создал еще один отдельный поток и засунул туда Application.ProcessMessage; и это тоже не помогло, как сделать так чтоб программа реагировала и не подвисала...
zaporshivets (2003-09-15 11:37:00) [1]
Почему бытует мнение, что если программа порождает большое
количество потоков, то большинство из них находится в ожидании?
Ну конечно же, они все работают на 1 процессоре одновременно, при этом загружая его на 4%. И чегой-то большинство серверов многопроцессорные? Почитай умные книжки по работе Windows с потоками и поймешь.
AGGRESSOR (2003-09-15 10:13:00) [2]
>В конце работы метода Execute пошли сообщение главному окну >или окну приложения, сигнализирующее что поток заверши работу, >а в обработчике делай нужные действия.
Тем и живем (с) :)
Verg (2003-09-13 15:20:00) [3]
> Почему бытует мнение, что если программа порождает большое
> количество потоков, то большинство из них находится в ожидании?
Где это?(бытует)
Мне слово "бытует мнение" не нравится.
, то большинство из них находится в ожидании?
не ТО, а ИМЕННО
Короче,
> вощем я нашел очень хороший VCL для работы с потоками, но
> теперь другая трабла...
все это мне почему-то не нравится....
Пока ТЫ не разберешься с потоками и не отделишь "мух от котлет", эти самые "другая трабла" будут тебя мучать да скончания веков...
SPeller (2003-09-13 02:26:00) [4]
> Хочу дождаться завершения работы потока, а потом продолжать
> работу
В конце работы метода Execute пошли сообщение главному окну или окну приложения, сигнализирующее что поток заверши работу, а в обработчике делай нужные действия.
Bes (2003-09-13 00:51:00) [5]
все вроде пашет, там просто не Coinitialize а CoinitializeEx
Bes (2003-09-13 00:17:00) [6]
а мне дельфя говорит что незнает такого слова как Coinitialize блин откуда загружать...в каком она модуле то
y-soft (2003-09-12 22:24:00) [7]
Ну так в самом начале Execute вызывайте Coinitialize(nil), а в самом конце - Couninitialize
В главном потоке это и так делается при инициализации, поэтому в Synchronize и не вылетает исключение...
Bes (2003-09-12 21:39:00) [8]
вощем я нашел очень хороший VCL для работы с потоками, но теперь другая трабла...
почему-то когда я пишу в Execute"e что-то типа aq:=TadoQuery.Create(self)// var aq:Tadoquery;
или AdoQuery1.open;
вылетает ошибка
EOleSysError " Не был произведен вызов CoInitialize"
а если запускаю Create или Open (TadoQuery) из процедуры под Synchronize"ом все нормально работет без ошибок...
как быть как лечить...
w666w (2003-09-12 18:30:00) [9]
Почему бытует мнение, что если программа порождает большое количество потоков, то большинство из них находится в ожидании? У меня сканер портов порождает до 2000 потоков, и каждый из них работает, никаких простоев, никаких пауз. Загрузка ЦП на 4p ~50%.
Другого решения вопроса (ессно в моем случае) просто не существует. Извините за оффтопик, никакого отношения к проблеме Bes"а этот пост не имеет.
AGGRESSOR (2003-09-12 18:27:00) [10]
>Ну, допустим нагружен-то он только ожиданием.
Но мне ведь от этого не легче! Для меня имеет значение то, что в это время главная форма не отвечает на запросы. А надо бы, по идее. Разве нет? А то какой смысл использовать поток? У меня в нем обрабатывается 20-метровый текстовый файл...
y-soft (2003-09-12 17:46:00) [11]
>panov © (12.09.03 17:34) [21]
У меня совершенно спокойно работает по 100-200 потоков при загруженности процессора процентов на 20.
Круто! :) Наверняка они большую часть времени находятся в режиме ожидания...
panov (2003-09-12 17:34:00) [12]
Три потока на 1- процессорной системе и то много.
Откуда такая информация?
У меня совершенно спокойно работает по 100-200 потоков при загруженности процессора процентов на 20.
У каждой задачи есть свои ограничения, в том числе и при использовании потоков.
Использовать потоки нужно при необходимости, а не "потому, что это красиво".
zaporshivets (2003-09-12 17:15:00) [13]
25 потоков??? Зачем???? У тебя больше времени будет уходить на переключение между ними, а не на работу. Три потока на 1- процессорной системе и то много. Пересмотри код программы и не будет лишних вопросов.
Verg (2003-09-12 15:58:00) [14]
использовании .WaitFor нагруженным получается главный поток, как при Synchronize.
Ну, допустим нагружен-то он только ожиданием.
> дождатьсязавершения работы потока, а потом продолжатьработу
Как бы "дождаться и только потом продолжать...".
Ну вы это и имеете.
AGGRESSOR (2003-09-12 15:34:00) [15]
Про грузчиков с мешками- это точно, лучше не придумаешь!
Вот и у меня информация к размышлению. Хочу дождаться завершения работы потока, а потом продолжать работу. При использовании.WaitForнагруженным получается главный поток, как при Synchronize. Само собой, что так мне не нравится. Есть ли выход?
panov (2003-09-12 13:51:00) [16]
Удалено модератором
Verg (2003-09-12 13:43:00) [17]
Подозреваю, что у тебя проблемы с одновременным доступом к таблице (записи в ней), типа блокировки.
В твоей ТОЙ программе TQuery выполнялись последовательно - один за другим.
Сейчас же они выполняются (пытаются) одновременно.
Проблема где-то здесь.
Verg (2003-09-12 13:38:00) [18]
> т.е. поток вообще не создается..
Ну..ну! не создается....
Создается, только быстренько завершается, например, по причине исключения (exception) произошедшего по ходу execute.
Там и смотри - что за исключение, почему...
> если без Executeто ничего не меняеться постоянно 1 поток...
Логично.
Bes (2003-09-12 13:20:00) [19]
вощем если я просто засовываю операции в Execute вообщем ниче не получается, т.е. поток вообще не создается..
проверял с помощью Диспечера задач (WinXP) вывел колонку потоки...
если без Execute то ничего не меняеться постоянно 1 поток...
а если с Synchronize(DoWork) то все работает и Диспечер задач показывает 26 потоков...
вот так...че делать-то
jack128 (2003-09-12 02:40:00) [20]
> вот мое предположение если Synchronize(DoWork) то процедура
> DoWork выполняется не в отдельном потоке а в главном,
именно так.
> если же непросто в Execute"e писать какие-то действия то
> все выполняется в новом потоке (отдельном)
если выделенно убрать, то правильно.