Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-52260
Zheks
2003-12-04 10:24
2003.12.16
Левоая консольная прога чарез CreateProcess


3-52082
Sodom
2003-11-24 14:59
2003.12.16
Выполнение очень долгого запроса.


14-52394
Dimedrol
2003-11-20 19:29
2003.12.16
Цифровой фотик


6-52310
пачка
2003-10-20 21:33
2003.12.16
Посоветуйте как организоватъ приложения клиента и сервера


14-52351
Aristokrat
2003-11-12 08:48
2003.12.16
Создание элементов на форме.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский