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

Вниз

Поток загружает процессор на 100%   Найти похожие ветки 

 
HydraMarat   (2004-08-21 00:27) [0]

Здравствуйте. На днях обнаружил интересную особенность работы потоков. Класс, чей метод Execute содержит пустой цикл repeat-until, загружает процессор, если верить Диспетчеру задач, на все 100%! И судя по работе других программ это недалеко от истины. Но ведь цикл то пустой! Когда-то писал прогу, так там repeat-until включал/отключал Action"ы и все пахало... Запустил сегодня ее (для проверки) и тоже - 100% загрузка! В чем же дело? Разъясните, пожалуйста! У меня есть подозрение, что дело вообще в Windows XP, а не в Delphi...

Спасибо.

P.S. Установка приоритета в tpLowest ничего не изменила...


 
VMcL ©   (2004-08-21 00:48) [1]

procedure TMyThread.Execute;
begin
 while not Terminated do
   Sleep(1);
end;


 
Sergey_Masloff   (2004-08-21 00:49) [2]

HydraMarat   (21.08.04 00:27)  
А чего тут непонятного? Все как и должно быть.


 
HydraMarat   (2004-08-21 01:20) [3]

Как это как должно быть? Поток не шиша не делает, а другие проги виснут? А если их будет с двадцатник (потоков)? Множество ведь прог используют потоки, а 100% загрузки проца я не вижу. Может чуть по-подробнее объясните...


 
мимо проходящий   (2004-08-21 01:29) [4]

> HydraMarat   (21.08.04 01:20) [3]

Да, множество прог используют потоки, и конечно все они содержат пустые циклы...


 
HydraMarat   (2004-08-21 02:27) [5]

Так все-таки, разъясните кто-нибудь: почему у меня 100%, а других прог меньше? Или действительно нужно сделать как VMcL предложил?


 
мимо проходящий   (2004-08-21 04:14) [6]

начинай с малого, с основ, чтобы потом подобных вопросов не возникало...


> HydraMarat   (21.08.04 02:27) [5]

как в твоем случае лучше, так и сделай.
для пустого цикла, можно как показал VMcL


 
Mim1 ©   (2004-08-21 08:13) [7]

Думается, что если поток ничего не делает, то он не должен гонять пустой цикл, а должен быть остановлен при помощи suspend или средств синхронизации (про которые советую почитать).

Делать то что предложил VMcL в нормальной программе считаю глупым, потому что ресурсы процессора расходуются на выполнение холостой, ненужной работы.


 
TUser ©   (2004-08-21 08:20) [8]


> Или действительно нужно сделать как VMcL предложил?

Нужно сделать именно так. Sleep(мало) сообщает системе, что поток не хочет работать в течении ближайщих ... мсек. Поэтому появляется возможность мередать управление другим потокам.


 
Verg ©   (2004-08-21 10:04) [9]


> Поток не шиша не делает, а другие проги виснут?


Как это "не шиша"? Как раз он и крутит тот самый цикл. Этим он и занят. Или ты думаешь, что операционка должна вникать в смысл происходящего в каждом потоке и делать выводы о том делом он занят или просто "балду гоняет"? :))

Если потоку нечем заняться, то он должен сам и "сказать" об этом операционке.
см.

> [7] Mim1 ©   (21.08.04 08:13)


 
Anatoly Podgoretsky ©   (2004-08-21 10:29) [10]

HydraMarat   (21.08.04 01:20) [3]
Как это ни чего, делает и еще как, на все 100 процентов крутит пустой цикл. Бездарно греет процессор.


 
HydraMarat   (2004-08-21 11:49) [11]

Всем огромное спасибо! Скорее всего буду через Event"ы с ним работать...

Возник еще вопросик. Если, например, поток что-то выполняет (конкретнее, открытие базы), а тут вдруг прогу закрывают... Ну, открытие базы у меня с критической секцией, так что ее закрытия я точно дождусь, а вот далее виснет на inherited Destroy. Подключил Classes.pas и получилось, что зависает в деструкторе TThread на WaitFor. Как же быть? Может что посоветуете?

Спасибо.



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

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

Наверх




Память: 0.49 MB
Время: 0.027 c
8-1087383433
Sanek_metaller
2004-06-16 14:57
2004.09.05
Как отчистить TImage от BitMap a?


4-1090432739
Alex870
2004-07-21 21:58
2004.09.05
TaskManager


14-1092809680
able
2004-08-18 10:14
2004.09.05
Зацените сайт...


1-1092744398
sdw_syscoder
2004-08-17 16:06
2004.09.05
Подождать нажатие кнопки


9-1084693130
djxxx
2004-05-16 11:38
2004.09.05
Как создать форму в DLL