Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.11.13;
Скачать: CL | DM;

Вниз

Подвисание...   Найти похожие ветки 

 
Bes ©   (2003-09-11 01:06) [0]

Вообщем я содаю 25 потоков с одинаковыми действиями, но разными входными параметрами...

все нормально работает, но вот только программа моя подвисает пока потоки работают...

я создал еще один отдельный поток и засунул туда Application.ProcessMessage; и это тоже не помогло, как сделать так чтоб программа реагировала и не подвисала...


 
BorH ©   (2003-09-11 03:09) [1]

Пробовал уменьшить количество потоков? Если тот же эффект, значит, что-то в коде не то...
А вообще скинь сюда, как ты строил их (ну, исходники). Посмотрим все вместе.


 
Digitman ©   (2003-09-11 09:13) [2]


> я создал еще один отдельный поток и засунул туда Application.ProcessMessage


глупее не придумаешь)

какое ты имеешь право вызывать метод VCL-объекта TApplication без синхронизации с осн.код.потоком ?


> и это тоже не помогло


при таком подходе к исследованию проблемы рискну спросить : а Вы их дустом не пробовали ?)

p.s.

Ну а если серьезно, то приводи весь код, относящийся к классу проблеммного потока.
без кода - пустой треп


 
Verg ©   (2003-09-11 09:34) [3]


> как сделать так чтоб программа реагировала и не подвисала...


Грамотно проектировать потоки.


 
y-soft ©   (2003-09-11 09:34) [4]

А не многовато 25 одновременно работающих потоков на 1 процесс?
Первичный поток при такой перегрузке может получать управление очччень редко :)


 
MBo ©   (2003-09-11 09:49) [5]

>y-soft © (11.09.03 09:34) [4]
>А не многовато 25 одновременно работающих потоков на 1 процесс?
Ведь если они нормально применяются - большинство потоков ждут событий, не крутясь вхолостую, то это не особо напрягает.

Как бы то ни было, без подробностей ничего сказать нельзя.


 
y-soft ©   (2003-09-11 09:55) [6]

>MBo © (11.09.03 09:49) [5]
Есть большие подозрения, что автор не подумал о таких вещах...

Так что, действительно, без кода ничего не посоветовать...


 
Bes ©   (2003-09-11 12:39) [7]

Вот код:

...
type
TTh=class(TThread)
private
path:string;
id:integer;
protected
procedure DoWork;
procedure Execute; override;
public
constructor Create(s:string;i:integer);
end;
...
var
t: array [0..50] of TTh;
...
...
constructor TTh.Create(s:string;i:integer);
begin
path:=s;
id:=i;
inherited Create(false);
end;
...
procedure TTh.Execute;
begin
Priority:=tpTimeCritical;
Synchronize(DoWork);
end;
...
...
procedure TTh.DoWork;
var
stat,dt,st:string;
begin
try
aq[id]:=TadoQuery.Create(form2);
aq[id].CursorLocation:=clUseServer;
...
..
.
aq[id].Close;
aq[id].Free;
dec(thread_count);
end;
...
...
procedure TForm1.Button1Click(Sender:TObject);
var
i:integer;
begin
for i:=0 to listbox1.items.count-1 do
t[i]:=TTh.Create(listbox1.items.strings[i],i);
end;
...

не знаю где трабла...


 
han_malign ©   (2003-09-11 12:44) [8]

>Priority:=tpTimeCritical;
- ну-ну...


 
Verg ©   (2003-09-11 12:51) [9]

Дык у тебя всю работу, за все 25 потоков делает один поток - главный.
Вся суть твоих потоков - это и есть нагрузить Synchronize главный поток.
Т.е. чего получается, каждому грузчику раздали по мешку, тык нет чтобы их таскать, они нашли "крайнего", и стоят в очереди к нему.... ну, чтобы он таскал по очереди их мешки.


 
Bes ©   (2003-09-11 13:00) [10]

2 han_malign © ну в принципе ис Priority=tpNormal; тоже самое...

2 Varg ну а как разделить их... если можно примерчик или ссылчку


 
Verg ©   (2003-09-11 13:10) [11]

Примерчик лежит у тебя под носом:
C:\Program Files\Borland\Delphi7\Demos\Db\BkQuery\


 
Bes ©   (2003-09-11 20:17) [12]

я посмотрел пример... но че та я прикола не понял...

вот мое предположение если Synchronize(DoWork) то процедура DoWork выполняется не в отдельном потоке а в главном, если же не просто в Execute"e писать какие-то действия то все выполняется в новом потоке (отдельном) так или нет ?


 
jack128 ©   (2003-09-12 02:40) [13]


> вот мое предположение если Synchronize(DoWork) то процедура
> DoWork выполняется не в отдельном потоке а в главном,

именно так.

> если же не просто в Execute"e писать какие-то действия то
> все выполняется в новом потоке (отдельном)
если выделенно убрать, то правильно.


 
Bes ©   (2003-09-12 13:20) [14]

вощем если я просто засовываю операции в Execute вообщем ниче не получается, т.е. поток вообще не создается..
проверял с помощью Диспечера задач (WinXP) вывел колонку потоки...
если без Execute то ничего не меняеться постоянно 1 поток...
а если с Synchronize(DoWork) то все работает и Диспечер задач показывает 26 потоков...

вот так...че делать-то


 
Verg ©   (2003-09-12 13:38) [15]


> т.е. поток вообще не создается..


Ну..ну! не создается....

Создается, только быстренько завершается, например, по причине исключения (exception) произошедшего по ходу execute.
Там и смотри - что за исключение, почему...


> если без Execute то ничего не меняеться постоянно 1 поток...


Логично.


 
Verg ©   (2003-09-12 13:43) [16]

Подозреваю, что у тебя проблемы с одновременным доступом к таблице (записи в ней), типа блокировки.

В твоей ТОЙ программе TQuery выполнялись последовательно - один за другим.
Сейчас же они выполняются (пытаются) одновременно.
Проблема где-то здесь.


 
panov ©   (2003-09-12 13:51) [17]

Удалено модератором


 
AGGRESSOR ©   (2003-09-12 15:34) [18]

Про грузчиков с мешками- это точно, лучше не придумаешь!
Вот и у меня информация к размышлению. Хочу дождаться завершения работы потока, а потом продолжать работу. При использовании .WaitFor нагруженным получается главный поток, как при Synchronize. Само собой, что так мне не нравится. Есть ли выход?


 
Verg ©   (2003-09-12 15:58) [19]

использовании .WaitFor нагруженным получается главный поток, как при Synchronize.

Ну, допустим нагружен-то он только ожиданием.


> дождаться завершения работы потока, а потом продолжать работу


Как бы "дождаться и только потом продолжать...".

Ну вы это и имеете.


 
zaporshivets   (2003-09-12 17:15) [20]

25 потоков??? Зачем???? У тебя больше времени будет уходить на переключение между ними, а не на работу. Три потока на 1- процессорной системе и то много. Пересмотри код программы и не будет лишних вопросов.


 
panov ©   (2003-09-12 17:34) [21]

Три потока на 1- процессорной системе и то много.

Откуда такая информация?

У меня совершенно спокойно работает по 100-200 потоков при загруженности процессора процентов на 20.

У каждой задачи есть свои ограничения, в том числе и при использовании потоков.

Использовать потоки нужно при необходимости, а не "потому, что это красиво".


 
y-soft ©   (2003-09-12 17:46) [22]

>panov © (12.09.03 17:34) [21]

У меня совершенно спокойно работает по 100-200 потоков при загруженности процессора процентов на 20.


Круто! :) Наверняка они большую часть времени находятся в режиме ожидания...


 
AGGRESSOR ©   (2003-09-12 18:27) [23]

>Ну, допустим нагружен-то он только ожиданием.
Но мне ведь от этого не легче! Для меня имеет значение то, что в это время главная форма не отвечает на запросы. А надо бы, по идее. Разве нет? А то какой смысл использовать поток? У меня в нем обрабатывается 20-метровый текстовый файл...


 
w666w   (2003-09-12 18:30) [24]

Почему бытует мнение, что если программа порождает большое количество потоков, то большинство из них находится в ожидании? У меня сканер портов порождает до 2000 потоков, и каждый из них работает, никаких простоев, никаких пауз. Загрузка ЦП на 4p ~50%.

Другого решения вопроса (ессно в моем случае) просто не существует. Извините за оффтопик, никакого отношения к проблеме Bes"а этот пост не имеет.


 
Bes ©   (2003-09-12 21:39) [25]

вощем я нашел очень хороший VCL для работы с потоками, но теперь другая трабла...

почему-то когда я пишу в Execute"e что-то типа aq:=TadoQuery.Create(self)// var aq:Tadoquery;
или AdoQuery1.open;

вылетает ошибка
EOleSysError " Не был произведен вызов CoInitialize"

а если запускаю Create или Open (TadoQuery) из процедуры под Synchronize"ом все нормально работет без ошибок...

как быть как лечить...


 
y-soft ©   (2003-09-12 22:24) [26]

Ну так в самом начале Execute вызывайте Coinitialize(nil), а в самом конце - Couninitialize

В главном потоке это и так делается при инициализации, поэтому в Synchronize и не вылетает исключение...


 
Bes ©   (2003-09-13 00:17) [27]

а мне дельфя говорит что незнает такого слова как Coinitialize блин откуда загружать...в каком она модуле то


 
Bes ©   (2003-09-13 00:51) [28]

все вроде пашет, там просто не Coinitialize а CoinitializeEx


 
SPeller ©   (2003-09-13 02:26) [29]


> Хочу дождаться завершения работы потока, а потом продолжать
> работу

В конце работы метода Execute пошли сообщение главному окну или окну приложения, сигнализирующее что поток заверши работу, а в обработчике делай нужные действия.


 
Verg ©   (2003-09-13 15:20) [30]


> Почему бытует мнение, что если программа порождает большое
> количество потоков, то большинство из них находится в ожидании?


Где это?(бытует)
Мне слово "бытует мнение" не нравится.

, то большинство из них находится в ожидании?

не ТО, а ИМЕННО

Короче,

> вощем я нашел очень хороший VCL для работы с потоками, но
> теперь другая трабла...


все это мне почему-то не нравится....

Пока ТЫ не разберешься с потоками и не отделишь "мух от котлет", эти самые "другая трабла" будут тебя мучать да скончания веков...


 
AGGRESSOR ©   (2003-09-15 10:13) [31]

>В конце работы метода Execute пошли сообщение главному окну >или окну приложения, сигнализирующее что поток заверши работу, >а в обработчике делай нужные действия.
Тем и живем (с) :)


 
zaporshivets   (2003-09-15 11:37) [32]

Почему бытует мнение, что если программа порождает большое
количество потоков, то большинство из них находится в ожидании?

Ну конечно же, они все работают на 1 процессоре одновременно, при этом загружая его на 4%. И чегой-то большинство серверов многопроцессорные? Почитай умные книжки по работе Windows с потоками и поймешь.



Страницы: 1 вся ветка

Текущий архив: 2003.11.13;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.022 c
14-42036
*pavel
2003-10-16 09:29
2003.11.13
Лечение Novell


3-40843
Uran
2003-10-21 17:26
2003.11.13
Выборка из IB русских символов с помощью UPPER


6-41859
mao
2003-09-11 11:09
2003.11.13
Сложно создать приложение для работы с локальной сетью?


14-41973
Юрий Зотов
2003-10-13 13:35
2003.11.13
По поручению Красной Майки (закрытие сезона).


3-41060
Dim!S
2003-10-23 11:19
2003.11.13
Хранение однотипных элементов