Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Подвисание... [D7, WinXP]


Страницы:   1 2

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 писать какие-то действия то
> все выполняется в новом потоке (отдельном)
если выделенно убрать, то правильно.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо