Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

High CPU usage [D5, D6, Win2k]


dumb ©   (2002-09-06 07:51:00) 

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;


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

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


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

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


Suntechnic   (2002-09-06 18:53:00) [3]

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

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

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


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

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


Suntechnic   (2002-09-06 18:15:00) [5]

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


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

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


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;


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


> Sleep(Timeout);

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


MBo   (2002-09-06 09:25:00) [8]

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


dumb   (2002-09-06 09:23:00) [9]

Думаю, 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:07:00) [10]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо