![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Загрузка ЦП: 100% [D6, Win2k]
Геннадий © (2004-09-24 08:11:00)Мой вопрос теоритический, так как даже не знаю, как его чётко сформулировать. При использовании компонент для сетевой (клиент-серверной) работы, загрузка процессора резко возрастает (во время работы приложения). Причём, если приложение получает информацию, обрабатывает и шлёт ответ (по логу эти события видны), то загрузка, наоборот, падает. А в момент простоя приложения - загрузка процессора под 100%. Если запустить на двупроцессорной платформе, то 25%. Причём такое случалось и с Indy-компонентами, и с компонентами сторонних производителей (то есть, моих деловых партнёров). Здесь я думаю исключительно на своё незнание какого-либо момента в программированиии. В связи с чем появляется вопрос, что вообще (теоритически) способно вызывать такое явление?
Digitman (2004-09-28 10:57:00) [1]
> если на серверной стороне что-то случится
так ведь если уж там что-то случилось, то тебе никакое "ожидание" и никакой повторный коннект не помогут !
Геннадий (2004-09-28 10:33:00) [2]2 Digitman © (27.09.04 15:55) [12]
Конечно! Только вот они не всегда срабатывают. Например, если на серверной стороне что-то случится - событие OnDisconnect может и не сработать. :(
Digitman (2004-09-27 15:55:00) [3]
> Геннадий
события-то есть какие-нибудь у этого компонента ?
что-то вроде OnConnect ? OnDisconnect ?
Геннадий (2004-09-27 15:48:00) [4]
> и ты, конечно, ведать не ведаешь, в каком режиме он работает
> - синхронном или асинхронном ? и исх.текстов нет ?
Угу.
> а что, кстати, страшного происходит, если сразу после Disconnect
> ты продолжишь дальнейшие действия, не дожидаясь чего-то ?
А какой смысл переподключаться, если не произойдёт отключение?
Digitman (2004-09-27 09:51:00) [5]
> Геннадий
> Компонента - левая (SMPPClient),
и ты, конечно, ведать не ведаешь, в каком режиме он работает - синхронном или асинхронном ? и исх.текстов нет ?
а что, кстати, страшного происходит, если сразу после Disconnect ты продолжишь дальнейшие действия, не дожидаясь чего-то ?
Геннадий (2004-09-25 11:31:00) [6]atruhin © (25.09.04 11:05) [8]
:) Дело в том, что вот казалось бы - куда ему деваться?! А этот гадёнышь может и не отключиться! Компонента - левая (SMPPClient), заменить не могу - не на что. Так что приходиться проверять...
atruhin (2004-09-25 11:05:00) [7]>>Дело в том, что при отключении (имеется в виду сетевое отключение >>моего клиента), нужно убедиться в том, что оно действительно >>произошло.
И как же ты в этом убеждаешся? Если ты отключаешь клиента то куда ему деться? От проблем с сетью этот код тебя не защитит.
Геннадий (2004-09-25 09:38:00) [8]> Digitman © (24.09.04 10:34) [6]
Дело в том, что при отключении (имеется в виду сетевое отключение моего клиента), нужно убедиться в том, что оно действительно произошло. На само отключении уходит когда 1 ms, а когла и минута. Так как заранее не известно сколько времени придёться ждать и при этом вечно ждать нельзя, я ввожу таймаут (~1 мин). Реализуется это так:
xxxxClient.Disconnect;
T:= GetTickCount;
while xxxxClient.Connected do
begin
Application.ProcessMessages;
Sleep(1);
If GetTickCount - T > 60000
then begin
raise Exception.Create('Timeout');
end;
end;
Polevi © (24.09.04 10:12) [4]
А почему? Загрузка ЦП упала до нуля! :)
Digitman (2004-09-24 10:34:00) [9]
> Геннадий
тебе что, задержку нужно осуществить ? для каких целей, в каком контексте она используется тобой ?
Anatoly Podgoretsky (2004-09-24 10:16:00) [10]Надо использовать объекты синхронизации, а не разогревать процессор.
Polevi (2004-09-24 10:12:00) [11]>Геннадий (24.09.04 10:01) [3]
не надо так делать
Геннадий (2004-09-24 10:01:00) [12]В приложении есть циклы (работают до некоторого события или таймаута), которые (судя по всему) и приводят к такой загрузке ЦП. Нужно делать примерно так:
T:= GetTickCount;
while GetTickCount - T < 10000 do
begin
Application.ProcessMessages;
Sleep(1);
end;
Digitman (2004-09-24 09:29:00) [13]каждый процесс, вне зависимости от того какие задачи он решает, в каждый момент времени находится в одном из 2-х режимов - kernel-mode или user-mode .. суммарное время работы процесса (с момента старта) в том или ином режиме контролируется ядром ОС - это т.н. kernel-time и user-time
в kernel-mode ядро ОС не выделяет процессу квантов времени, в user-mode же выделяет (в соответствии уровнями приоритетов кодовых потоков процесса)
т.н. "нагрузка" процессора растет, если суммарное время user-time существенно превышает суммарное kernel-time, и наоборот снижается, когда kernel-time превышает user-time
под kernel-mode подразумеваются моменты исполнения вызовов трэдами процесса API-ф-ций ожидания сообщений и ожидания срабатывания объектов синхронизации, а так же ф-ций задержки/приостановки трэдов.. когда все трэды процесса находятся в kernel-mode, user-time не растет, зато растет kernel-time ... когда хотя бы один трэд процесса нажодится в user-mode, user-time растет
"нагрузка" процессора для данного процесса в любой момент времени м.б. оценена по приблиз.формуле : 100 * user-time / (kernel-time + user-time)... из формулы видно, что значение "нагрузки" пропорционально значению user-time
иллюстрация :
1.
while True do;
такой пустой бесконечный цикл приводит к росту "нагрузки" вплоть до 100% (зависит от работы системного планировщика трэдов)
2.
while True do sleep(Х);
цикл так же бесконечен, но в его теле постоянно вызывается ф-ция задержки, приводящая к переключению в kernel-mode на время Х, при этом трэд не квантуется и "нагрузка" соответственно падает
Polevi (2004-09-24 09:25:00) [14]while not Terminated do Sleep(0) к примеру