![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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 в этой процедуре?