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

Вниз

Приложение загружает ЦП на 100%, как побороть?   Найти похожие ветки 

 
lipskiy ©   (2003-11-30 20:36) [0]

Использую чужой компонент (закачки по HTTP - HTTPCli), исходники есть. При работе закачки загрузка ЦП - 100%. Можно ли как-то определить место в коде, которое требует наибольшего процессорного времени? Или может можно искусственно ограничить загрузку ЦП приложением?
Процесс закачки у меня работает в отдельном thread, выставление ему низшего приоритета ни на что не влияет, видимо компонент закачки создает собственные потоки.


 
Юрий Зотов ©   (2003-11-30 22:12) [1]

Ищите цикл в алгоритме закачки (вполне возможно, в нем есть вызов Application.ProcessMessages). Этот цикл и грузит CPU.

Как с этим бороться - зависит от того, что написано в цикле.


 
lipskiy ©   (2003-12-01 01:07) [2]

Нашел в коде такое место, спасибо за подсказку!

procedure THttpCli.DoRequestSync(Rq : THttpRequest);
begin
DoRequestAsync(Rq);

{$IFDEF VER80}
{ Delphi 1 has no support for multi-threading }
while FState <> httpReady do
Application.ProcessMessages;
{$ELSE}
if FMultiThreaded then begin
while FState <> httpReady do begin
FCtrlSocket.ProcessMessages;
Sleep(0);
end;
end
else begin
while FState <> httpReady do begin
{$IFNDEF NOFORMS}
Application.ProcessMessages;
{$ELSE}
FCtrlSocket.ProcessMessages;
{$ENDIF}
Sleep(0);
end;
end;
{$ENDIF}

if FStatusCode >= 400 then
raise EHttpException.Create(FReasonPhrase, FStatusCode);
end;


В исходнике так и стояли Sleep(0), я сделал побольше, 200, загрузка ЦП упала в среднем до 60%.
Может быть есть еще способы дальнейшего снижения загрузки? И правильно ли писать Sleep вообще в таких местах?


 
lipskiy ©   (2003-12-01 01:19) [3]

Наврал немного, загрузка снижена до 30%!
Думаю, этого вполне достаточно.
Спасибо, Юрий, вы как всегда помогли точным дельным советом!


 
Ломброзо ©   (2003-12-01 01:47) [4]

Установить приоритет потоков пониже и Sleep побольше. Контролировать создание потоков таким образом, чтобы их было одноевременно не больше 5-10.


 
Ihor Osov'yak ©   (2003-12-01 04:06) [5]

Хм..

Крутить щыкл, ожидая готовность - имхо, не мудро..
Более оптимально - либо ассинхонная работа, либо синхронно - но в отдельном потоке, и с человеческой синхронизацией, а не через флажки и цыклы опроса..
Еще. При виде такого кода - я бы не рискнул связываться с этой компонентой..

> Установить приоритет потоков пониже
Приоритет потоков - это относительно других потоков в приложении. Если все они (или большинство из них) будут с пониженным приоритетом - то картина от этого не изменится..

> и Sleep побольше
Выкрутасы со слип, как правило, из-за неумения либо ассихронно работать, либо неумения использовать обьекты синхронизации в случае синхронной работы в дополнительных потоках..


 
Юрий Зотов ©   (2003-12-01 07:52) [6]

> я бы не рискнул связываться с этой компонентой..

Согласен с Игорем.


 
Nikolay M. ©   (2003-12-01 09:41) [7]


> Процесс закачки у меня работает в отдельном thread

Еще попробую угадать: ОС - NT4, 2000 или ХР?
Тогда из-за особенности реализации многопоточности на ядре НТ, если в потоке имеется цикл, нужно в этом цикле ставить Sleep (1).


 
lipskiy ©   (2003-12-04 02:47) [8]


> > я бы не рискнул связываться с этой компонентой..
>
> Согласен с Игорем.

Да я и не настаиваю на использовании именно этого компонента, просто ничего другого не нашел, мне нужна закачка файлов по HTTP, бесплатная.


> Еще попробую угадать: ОС - NT4, 2000 или ХР?

Угу, ХР.
То есть размер sleep роли не играет, главное чтоб не 0? Так я понимаю?

А компонент это работает неплохо, между прочим. Я тут основательно потестил, выгрузил все лишнее и наблюдал загрузку ЦП, так сама программа в списке процессов показывает всего 6% против 80-ти ранее, а в целом проц загружается на 15-20% против 100. Так что не знаю, может он и криво написан, но зато бесплатно и не глючит (тьфу-тьфу-тьфу).


 
Nikolay M. ©   (2003-12-04 09:25) [9]


> > Еще попробую угадать: ОС - NT4, 2000 или ХР?
>
> Угу, ХР.
> То есть размер sleep роли не играет, главное чтоб не 0?
> Так я понимаю?

Да, в точечности. Ради эксперимента можешь попробовать создать тестовое приложение с дополнительным потоком и в Execute поставить Sleep(1), а потом закомментировать его.


> А компонент это работает неплохо, между прочим.

Согласен. У меня уже года 3 качает файлы в круглосуточном режиме - не жалуюсь.


 
lipskiy ©   (2003-12-04 12:37) [10]

Ясно, спасибо!



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

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

Наверх




Память: 0.49 MB
Время: 0.016 c
1-52176
Don
2003-12-03 13:56
2003.12.16
Как изменить вид кнопки ?


4-52447
Zhirnov Maxim
2003-10-23 13:30
2003.12.16
Как открыть нужный раздел в *.chm файле?


14-52335
тимеман
2003-11-23 12:07
2003.12.16
Часовые пояса.


7-52415
LeNa19
2003-10-09 23:30
2003.12.16
передача параметров при запуске приложения


3-52107
SVha
2003-11-21 13:08
2003.12.16
Как передать в процедуру CLOB параметр для ODAC 4.10