Форум: "Основная";
Текущий архив: 2004.09.05;
Скачать: [xml.tar.bz2];
ВнизПоток загружает процессор на 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.06 c