Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
1-41563
killer
2003-10-27 13:18
2003.11.13
Второй запуск программы


14-42007
Паша
2003-10-16 19:18
2003.11.13
про котика. я плакалъ


3-40920
hunter84
2003-10-20 00:31
2003.11.13
Проверка обновления данных на серваке из клиентского приложения


1-41557
lipskiy
2003-10-24 00:15
2003.11.13
Как вызвать стандартный диалог выбора папки?


8-41771
Sash1304
2003-07-15 12:47
2003.11.13
Графика. Работа с большим ресурсом.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский