Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2002.02.25;
Скачать: [xml.tar.bz2];

Вниз

Здадержка   Найти похожие ветки 

 
Snake2000   (2001-12-21 17:28) [0]

Как реализовать задержку, что бы при выполнении цикла можно было свободно работать с моим приложением? Конструкция типа

for i:=1 to 1000 do
begin
......
sleep(1);
Application.Processmessages;
end;

не подходит (ну это и глупое решение - сами понимаете :)), т.к. все равно до завершения цикла, с окном работать невозможно.
Помогите!


 
Digitman   (2001-12-21 17:37) [1]

Что значит - "до завершения цикла, с окном работать невозможно" ??


 
Виктор Щербаков   (2001-12-21 17:39) [2]

Выполняй цикл в отдельном потоке. Поставь этому потоку нужный приоритет
Смотри TThread в хэлпе. Или в SDK Thread Functions.

Кстати Sleep в твоем коде не нужен.


 
Snake2000   (2001-12-21 17:58) [3]

Помоги это реалмзовать, пожалуйста. Сам никогда с потоками не работал, так что вряд ли разберусь


 
handra   (2001-12-21 17:59) [4]

sleep, как раз нужен - для того, чтобы отдать процессорное время другим приложениям (не надо забывать о соседях!)


 
Snake2000   (2001-12-21 18:14) [5]

Если sleep убрать, на разных компах задержка будет разной


 
Юрий Зотов   (2001-12-21 21:10) [6]

Если sleep убрать, то задержка будет ровно такой, какая и нужна. А соседи свое процессорное время все равно получат (если не играть с приоритетами), потому что в Wi32 ВЫТЕСНЯЮЩАЯ мультизадачность.

В общем - либо уберите sleep (он только мешает делу), либо выносите цикл в метод TThread.Execute.


 
panov   (2001-12-21 21:21) [7]

>Юрий Зотов © (21.12.01 21:10)
А разве если убрать sleep, процессор не будет загружен на 100%?
Другие процессы, конечно получат свое процессорное время, но я хочу видеть реальную загрузку процессора, а не бесконечный цикл.

Как мне кажется, самое лучшее, вынести обработку в отдельный поток с высоким приоритетом, обязательно оставив sleep(n).




 
Юрий Зотов   (2001-12-21 21:39) [8]

> panov © (21.12.01 21:21)

Поймите, ведь процессор ВСЕГДА загружен на 100%. Что значит, например, "загружен на 50%"? Что он, по полкоманды выполняет, что ли? Нет, конечно. Простаивает половину времени? Тоже нет, простаивать он тоже не умеет. Холостые циклы крутит? Так это тоже 100%-я загрузка.

А значит это, что в течение НЕКОТОРОГО интервала времени процессор 50% времени обслуживал ядро самой системы, а другие 50 - некие прикладные (с точки зрения ядра) задачи. Заметьте - "в течение НЕКОТОРОГО интервала времени" - того интервала, с периодичностью которого измеряется загруженность процессора.

То же самое и здесь. Процессор будет загружен на 100%, но только В ТЕЧЕНИЕ ОДНОГО ВИТКА ЦИКЛА И НЕ БОЛЕЕ КВАНТА ВРЕМЕНИ, ОТВЕДЕННОГО ДАННОМУ ПОТОКУ. А потом дело дойдет до ProcessMessages, программа обработает очередь сообщений и все пойдет по новой - пока не кончится квант. А по его окончании CPU будет отдан другой программе.

И даже если вынести цикл в другой поток, то загрузка процесора все равно будет 100% - но тоже в пределах одного кванта. Разница лишь в том, что при этом сообщения будут обрабатываться программой как бы одновременно с циклом. Точнее, программа сможет обрабатывать сообщения не в конце витка цикла, а в другом кванте - то есть, чаще. Вот и все.


 
panov   (2001-12-21 21:43) [9]

А разве в то время пока выполняется sleep, процессор не простаивает?


 
Юрий Зотов   (2001-12-21 21:58) [10]

Нет, конечно, он отдается системой другому потоку (того же процесса, или другого - неважно). Это было бы слишком расточительно.

Даже если написать Sleep(0), то процессор будет тут же отдан другому потоку. Сразу, а не по окончании кванта.


 
Anatoly Podgoretsky   (2001-12-21 22:39) [11]

В WinXX это вроде бы именно так, но в других ОС может быть и иначе, например в Линухе процессор может переводиться в состояние HALT если для него нет работы, поэтому он там менее греется.


 
panov   (2001-12-22 11:31) [12]

>Юрий Зотов © (21.12.01 21:58)
Я неправильно выразился, нужно было: "А разве в то время пока выполняется sleep, процессор не простаивает, если нет других задач".
"простаивает" в смысле "не занят полезной работой":-)
А во время Application.ProcessMessages процессор как я понимаю занят на полную катушку...

>Anatoly Podgoretsky © (21.12.01 22:39)
Я это и имел ввиду. Зачем, если для системы на данный момент нет полезной работы, загружать процессор?

Мне кажется, что непрерывный цикл оправдан только для системы реального режима времени?

А вызов sleep(n) как раз и позволяет загружать по-минимуму процессор в цикле.


 
Anatoly Podgoretsky   (2001-12-22 19:21) [13]

Только для системы жесткого реального времени


 
Юрий Зотов   (2001-12-24 12:37) [14]

> panov © (22.12.01 11:31)

> А во время Application.ProcessMessages процессор
> как я понимаю занят на полную катушку...


Смотрим в исходники...

procedure TApplication.ProcessMessages;
var
Msg: TMsg;
begin
while ProcessMessage(Msg) do {loop};
end;

function TApplication.ProcessMessage(var Msg: TMsg): Boolean;
var
Handled: Boolean;
begin
Result := False;
if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
begin
Result := True;
... // Skipped (обработка выбранного из очереди сообщения)
end;
end;

Таким образом, вызов Application.ProcessMessages всего лишь приводит к обработке всех находящихся в очереди на данный момент сообщений. При этом, конечно, процессор занят (а как иначе можно их обработать?). Если же сообщений в очереди нет, то тут же происходит возврат.

Таким образом, вызов Application.ProcessMessages нагружает процессор не более, чем обычно. Что и естественно, поскольку все GUI-программы именно так и работают - постоянно крутят цикл выборки сообщений. И ничего страшного при этом не происходит.

Тут важно вот что. Нам требуется выполнить некие действия и обработать сообщения. Для этого мы делаем цикл:

while <условие> do
begin
... // Выполняем действия
Application.ProcessMessage // Обрабатываем сообщения
end;

Насколько при этом будет загружен процессор? Ответ - всегда на 100% (а как же иначе? по-другому он работать не умеет), но только В ПРЕДЕЛАХ ОДНОГО КВАНТА. По истечении же этого кванта CPU получит другой процесс. И если период измерения загрузки CPU более одного кванта (а оно, надо полагать, так и есть, иначе это не измерение а бред получится), то СРЕДНЯЯ за этот период загрузка CPU может оказаться менее 100% (конкретная цифра зависит от всех процессов в системе).

И ничего страшного в этом нет. Нам требуется сделать определенную работу. Если для ее выполнения требуется 100%-ная загрузка CPU, значит, она будет 100% - хоть выноси эту работу в отдельный поток, хоть не выноси. Если же для ее выполнения достаточно 80%-ной загрузки - значит, она будет 80%. А как же еще CPU может выполнить эту работу?



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

Форум: "WinAPI";
Текущий архив: 2002.02.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.004 c
1-79335
sammy
2002-02-08 08:24
2002.02.25
помогите узнать размер папки!


1-79351
mrcat
2002-02-07 18:51
2002.02.25
комиляция числовых выражений


7-79483
Dmitry V. Averuanov
2001-11-08 10:28
2002.02.25
Как


14-79459
evgeg
2002-01-08 00:19
2002.02.25
перед Паскалем склоняю голову (с) Страуструп


6-79421
NailS
2001-11-29 15:09
2002.02.25
Алгоритмы передачи данных для TCP





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский