Форум: "WinAPI";
Текущий архив: 2002.10.21;
Скачать: [xml.tar.bz2];
Вниз
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.10.21;
Скачать: [xml.tar.bz2];
Память: 0.78 MB
Время: 1.88 c