Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.46 MB
Время: 0.013 c
14-68962
cardinal
2002-09-28 10:37
2002.10.21
Отправка почты


1-68825
Sergey_Elf
2002-10-10 10:32
2002.10.21
Запускаю архиватор через shellexecute, как узнать когда закончил


1-68757
AL2002
2002-10-09 19:23
2002.10.21
SaveDialog. Как убрать путь?


4-69072
Mic_2000
2002-09-08 14:14
2002.10.21
RAS


14-68940
France
2002-09-27 15:09
2002.10.21
Телефон Siemens C35i





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский