Форум: "Основная";
Текущий архив: 2003.12.16;
Скачать: [xml.tar.bz2];
ВнизПриложение загружает ЦП на 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.066 c