![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поток загружает процессор на 100% [D7, WinXP]
HydraMarat © (2004-08-21 00:27:00)Здравствуйте. На днях обнаружил интересную особенность работы потоков. Класс, чей метод Execute содержит пустойцикл repeat-until, загружает процессор, если верить Диспетчеру задач, на все 100%! И судя по работе других программ это недалеко от истины. Но ведь цикл то пустой! Когда-то писал прогу, так там repeat-until включал/отключал Action'ы и все пахало... Запустил сегодня ее (для проверки) и тоже - 100% загрузка! В чем же дело? Разъясните, пожалуйста! У меня есть подозрение, что дело вообще в Windows XP, а не в Delphi...
Спасибо.
P.S. Установка приоритета в tpLowest ничего не изменила...
HydraMarat (2004-08-21 11:49:00) [1]Всем огромное спасибо! Скорее всего буду через Event'ы с ним работать...
Возник еще вопросик. Если, например, поток что-то выполняет (конкретнее, открытие базы), а тут вдруг прогу закрывают... Ну, открытие базы у меня с критической секцией, так что ее закрытия я точно дождусь, а вот далее виснет на inherited Destroy. Подключил Classes.pas и получилось, что зависает в деструкторе TThread на WaitFor. Как же быть? Может что посоветуете?
Спасибо.
Anatoly Podgoretsky (2004-08-21 10:29:00) [2]HydraMarat (21.08.04 01:20) [3]
Как это ни чего, делает и еще как, на все 100 процентов крутит пустой цикл. Бездарно греет процессор.
Verg (2004-08-21 10:04:00) [3]
> Поток не шиша не делает, а другие проги виснут?
Как это "не шиша"? Как раз он и крутит тот самый цикл. Этим он и занят. Или ты думаешь, что операционка должна вникать в смысл происходящего в каждом потоке и делать выводы о том делом он занят или просто "балду гоняет"? :))
Если потоку нечем заняться, то он должен сам и "сказать" об этом операционке.
см.
> [7] Mim1 © (21.08.04 08:13)
TUser (2004-08-21 08:20:00) [4]
> Или действительно нужно сделать как VMcL предложил?
Нужно сделать именно так. Sleep(мало) сообщает системе, что поток не хочет работать в течении ближайщих ... мсек. Поэтому появляется возможность мередать управление другим потокам.
Mim1 (2004-08-21 08:13:00) [5]Думается, что если поток ничего не делает, то он не должен гонять пустой цикл, а должен быть остановлен при помощи suspend или средств синхронизации (про которые советую почитать).
Делать то что предложил VMcL в нормальной программе считаю глупым, потому что ресурсы процессора расходуются на выполнение холостой, ненужной работы.
мимо проходящий (2004-08-21 04:14:00) [6]начинай с малого, с основ, чтобы потом подобных вопросов не возникало...
> HydraMarat (21.08.04 02:27) [5]
как в твоем случае лучше, так и сделай.
для пустого цикла, можно как показал VMcL
HydraMarat (2004-08-21 02:27:00) [7]Так все-таки, разъясните кто-нибудь: почему у меня 100%, а других прог меньше? Или действительно нужно сделать как VMcL предложил?
мимо проходящий (2004-08-21 01:29:00) [8]> HydraMarat (21.08.04 01:20) [3]
Да, множество прог используют потоки, и конечно все они содержат пустые циклы...
HydraMarat (2004-08-21 01:20:00) [9]Как это как должно быть? Поток не шиша не делает, а другие проги виснут? А если их будет с двадцатник (потоков)? Множество ведь прог используют потоки, а 100% загрузки проца я не вижу. Может чуть по-подробнее объясните...
Sergey_Masloff (2004-08-21 00:49:00) [10]HydraMarat (21.08.04 00:27)
А чего тут непонятного? Все как и должно быть.
VMcL (2004-08-21 00:48:00) [11]procedure TMyThread.Execute;
begin
while not Terminated do
Sleep(1);
end;