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

Вниз

High CPU usage   Найти похожие ветки 

 
dumb   (2002-09-06 07:51) [0]

Help! Не могу понять в чем дело. Проблема была замечена только на w2k. Пишу сервис, который включает в себя единственную нить. При старте сервиса нить создается и стартует имея Priority := tpLowest. Метод Execute приведен ниже. Через некоторое время замечаю загрузку CPU около 100%! Где может скрываться проблема?


procedure TMyThread.Execute;
begin
FreeOnTerminate := True;
while not Terminated do
begin
ScanForFiles("c:\dox\");
Sleep(Timeout);
end;
end;


procedure TMyThread.ScanForFiles(Dir: string);
var
DirInfo: TSearchRec;
r : Integer;
begin
try
r := FindFirst(Dir + "*.doc", FaAnyfile, DirInfo);
while r = 0 do
begin
if ((DirInfo.Attr and FaDirectory <> FaDirectory) and
(DirInfo.Attr and FaVolumeId <> FaVolumeID))
and not Terminated then
Files.Add(pChar(Dir + DirInfo.Name));
r := FindNext(DirInfo);
end;
finally
SysUtils.FindClose(DirInfo);
end;
end;


 
MBo ©   (2002-09-06 09:07) [1]

Files.Add(pChar(Dir + DirInfo.Name));
Что это за Files?
Надо ли проверять Terminated в этой процедуре?


 
dumb   (2002-09-06 09:23) [2]

Думаю, Terminated никогда проверять не помешает, хотя здесь его можно и опустить. Files - это экземпляр класса TStrings. К этому моменту Files уже живой и позволяет делать с собой Add.

Похоже, что я не одинок. Например, на этом сайте http://computing.net/windows2000/wwwboard/forum/21220.html масса сообщений с Subject = 100% CPU usage от пользователей Win 2000. В основном им предлагается установить новейший Service Pack. Может кто-нибудь видит/знает другой корень зла?


 
MBo ©   (2002-09-06 09:25) [3]

Files - поле Thread-а или внешний?


 
Александр Спелицин ©   (2002-09-06 11:52) [4]


> Sleep(Timeout);

Простите, а чему равно значение Timeout? Если 0, то Ваш сервис будет занимать все 100% ресурсов процессора (процессороного времени).


 
dumb   (2002-09-06 17:20) [5]

Вот новый код, который тоже глючит.


TMyThread = class(TThread)
public
Timeout: integer;
Files: TStringList;
procedure Execute; override;
procedure ScanForFiles(Dir: string);
end;

procedure TMyThread.Execute;
begin
FreeOnTerminate := True;
while not Terminated do
begin
try
Files := TStringList.Create;
ScanForFiles("c:\dox\");
finally
Files.Free;
end;
Sleep(Timeout);
end;
end;


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

Значение Timeout = 5000;



 
Suntechnic ©   (2002-09-06 18:15) [6]

Если это единственный поток сервиса и он только тем и занимается, что ищет файлы на диске(пускай даже с интервалом в 5 сек.), то чего ты от него ждёшь? Что он не будет процессорное время потреблять?...
Из того кода что я вижу я не могу судить насколько это необходимо иметь такой поток "наблюдатель". Можно услышать цель всего этого действа? Может есть решения гораздо более эффективные и не настолько ресурсоёмкие, а ты о них просто не знаешь?


 
dumb   (2002-09-06 18:39) [7]

Наверняка есть. Таких потоков - два. После того, как файл найдем последует целая череда операций, НО до этого дело пока не дошло. Думаю, это не нормально, когда поток ест 100% CPU.


 
Suntechnic ©   (2002-09-06 18:53) [8]

>dumb (06.09.02 18:39)
Думаю, это не нормально, когда поток ест 100% CPU.

Ну конечно. Поток виноват... Он делает то, что ты ему скажешь делать. Скажешь ресурсы потреблять он их с удовольствием и потребляет....

И всё-таки можно услышать цель этого потока? Что он должен делать? Может тогда тебе и подскажут как это организовать получше.


 
MBo ©   (2002-09-06 19:00) [9]

FindFirstChangeNotification или
ReadDirectoryChangesW (для Win9X не пойдет)


 
dumb   (2002-09-07 04:24) [10]

С ReadDirectoryChangesW вроде не глючит...



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

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

Наверх




Память: 0.49 MB
Время: 0.017 c
14-68928
Дремучий
2002-10-01 02:10
2002.10.21
Политические игры и интриги....


1-68726
Saninsky
2002-10-10 19:48
2002.10.21
Запуск DOS приложений из Delphi


1-68799
Граф
2002-10-09 13:29
2002.10.21
WaitFor и TTread ы


1-68728
Daniil
2002-10-11 10:21
2002.10.21
Убрать рамку при выделении Item в TListBox?


1-68727
d_oleg
2002-10-11 10:28
2002.10.21
TGraphicControl - OnKeyDown