Форум: "WinAPI";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];
ВнизПодвисание... Найти похожие ветки
← →
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.959 c