как в бесконечных циклах избавиться от сильной загрузки машины
+5
Eric-S
diamass
Andrew
tux
electrik
Участников: 9
Страница 1 из 2
Страница 1 из 2 • 1, 2
как в бесконечных циклах избавиться от сильной загрузки машины
все мы когда либо делали программы в которых присудствуют безконечные циклы. во времена дос, об этом не задумывались, но а windows, многозадачная и вот тут, особенно в консольных приложениях бывают пробллемы. программа с бесконечным циклом почти весит машину, покрайней мере до 1 гигагерца. в простых приложениях, достаточно поставить в начале или в конце цикла Sleep, проблема исчезнет. но не всегда со sleep можно далеко уехать, так как он не позволяет прерывать программу на тысячные доли секунды, и если со sleep писать какую-нибудь программу обработки звука, или архиватор, эта программа будет работать сутками. конечно все можно расчитать, запускать слееп после некоторых событий, но это лишний код, да и зачем извращаться, если операционная система сама может распределить приоритеты.вот и возникает вопрос, операционке надо посылать какое-нибудь сообщение, чтоб она контролировала приложение. приведу пример:
код
dim key as integer
do
key=getkey
if hibyte(key)= 59 then 'если нажимаем скан код клавиши f1
print "key f1 scancode = ",hibyte(key) 'высвечиваем сканкод
end if
loop until lobyte(key)=27 'крутим бесконечную петлю, пока ненажмем escape, только уже по асции коду
вот как сделать такую петлю, чтоб она совсеми дружила и не грузила комп. у меня машина пень 3 гигагерца, ни чего не подвисает, а на работе k6 450 мегагерц, там это страшно запустить, прога забирает почти все. на 900 мегагерцах, тоже углючивает.
код
dim key as integer
do
key=getkey
if hibyte(key)= 59 then 'если нажимаем скан код клавиши f1
print "key f1 scancode = ",hibyte(key) 'высвечиваем сканкод
end if
loop until lobyte(key)=27 'крутим бесконечную петлю, пока ненажмем escape, только уже по асции коду
вот как сделать такую петлю, чтоб она совсеми дружила и не грузила комп. у меня машина пень 3 гигагерца, ни чего не подвисает, а на работе k6 450 мегагерц, там это страшно запустить, прога забирает почти все. на 900 мегагерцах, тоже углючивает.
electrik- Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург
Re: как в бесконечных циклах избавиться от сильной загрузки машины
в XP есть какието апиши (пардон непомню какие, тк сам не интересовался), которыми можно выставлять приоритет, соответсвенно если поставить меньший, то будет менше грузить
как в бесконечных циклах избавиться от сильной загрузки машины
я думаю, что к конкретной операционке не стоит привязыватся. пробовал запускать бесконечный цикл, в диспетчере задачь приоритет нормальный и все-равно грузит. даже если на visual basic запустить бесконечный цикл, он тоже начинает глючить.
electrik- Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург
Re: как в бесконечных циклах избавиться от сильной загрузки машины
хз, но допустим если глянуть работу с сокетами в винде, то там используется стандартный цикл обработки сообщений, а вот допустим в Линухе все делается только через обычные циклы. Притом и в других источнках обработка реализуется аналогично, вследствии в винде скорее всего мона реализовать чета подобное, используя какие либо разрешающие вызовы, а вот в линухе нинаю
Re: как в бесконечных циклах избавиться от сильной загрузки машины
так по-моему поставить sleep 10 в цикле, и грузить машину не будет.
Оно не глючит. Просто это связано с тем, что программа пытается выполнится как можно быстрее, доходит до максимума (ну к примеру 1000 циклов в секунду) и забирает все процессорное время. А если ее ограничить (сделать задержку) то уже будет не 1000 циклов в сек. а к примеру 500. И процессор будет тратить на него только половину времени.
P.S. В других языках (в которых я писал) это был Delay (10). Помогало когда писал программы типа чата, поскольку тоже была такая же проблема.
visual basic запустить бесконечный цикл, он тоже начинает глючить
Оно не глючит. Просто это связано с тем, что программа пытается выполнится как можно быстрее, доходит до максимума (ну к примеру 1000 циклов в секунду) и забирает все процессорное время. А если ее ограничить (сделать задержку) то уже будет не 1000 циклов в сек. а к примеру 500. И процессор будет тратить на него только половину времени.
P.S. В других языках (в которых я писал) это был Delay (10). Помогало когда писал программы типа чата, поскольку тоже была такая же проблема.
Andrew- Сообщения : 45
Дата регистрации : 2008-09-23
Возраст : 35
Откуда : Киев
Re: как в бесконечных циклах избавиться от сильной загрузки машины
да я все понимаю на счет sleep. но как я и говорил, что слееп очень ограничен и если мне нужна задержка меньше чем предусмотрено в sleep, то тут уже не как. тоесть я понимаю так, что sleep поддерживает значение от одной миллисекунды. тоесть в одной секунде тысяча миллисекунд.
electrik- Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург
Re: как в бесконечных циклах избавиться от сильной загрузки машины
В VB можно вставить DoEvents и цикл будет срабатывать через раз, чтобы дать приложениям тоже время.visual basic запустить бесконечный цикл, он тоже начинает глючить
Sub Proba()
Dim a As Long
For a = 0 To 1000000000
DoEvents
' Чего-нибудь творим.
Next a
End Sub
Может и в FB есть что-то подобное.
Дело в том, что Slib Не высвобождает тики процессора, а просто притормаживает программу, но приэтом продолжает слидить за таймером.
Slip(10)
По меньшей мере по миллисекундам следить будет, что на дохлых машинах не даст ожидаемого ускорения.
DoEvents же останавливает приложение на один тик и если нет активности приложений, то возобнавляет работу до следующего прохода.
Если же есть активность других приложений, то программа может пропустить горазда больше одного тика.
Проверено и отслежено по таймеру.
Re: как в бесконечных циклах избавиться от сильной загрузки машины
Да. Сейчас глянул в мануал и не нашел DoEvents.
Толи поиск глючит, толи надо вкрутить.
нтересно, а как это на ассемблере может выглядить. Там же ведь тоже есть ожидание тика.
Кстати, а тик, это сколько?
Толи поиск глючит, толи надо вкрутить.
нтересно, а как это на ассемблере может выглядить. Там же ведь тоже есть ожидание тика.
Кстати, а тик, это сколько?
Re: как в бесконечных циклах избавиться от сильной загрузки машины
обычно элементарная комманда на асме выполняется в среднем за 3-4 тика, nop помоему за один, задержки в асме помоему и делаются использованием nop-а в циклах, или по прерываниям от таймера... но об етом лучше наверно расскажет электрик
Re: как в бесконечных циклах избавиться от сильной загрузки машины
Неа. Это такт. Как раз ассемблерная команда и выполняется за 1 или более тактов.
А вот "тик" это скорее из области многозадачности. Но я не уверен.
Например в php можно зарегистрировать функцию, которая будет вызываться каждый тик.
Если бы тик был бы слишком маленький, то всё бы тут же подвисало.
А вот "тик" это скорее из области многозадачности. Но я не уверен.
Например в php можно зарегистрировать функцию, которая будет вызываться каждый тик.
Если бы тик был бы слишком маленький, то всё бы тут же подвисало.
Незадача
По моему тик это пол секунды, потому что тик-так это уже целая секунда!
Если серьезно, , то впервые слышу о таком понятии в программировании как "тик".
Может кто то объяснит о чем идет речь
Если серьезно, , то впервые слышу о таком понятии в программировании как "тик".
Может кто то объяснит о чем идет речь
Re: как в бесконечных циклах избавиться от сильной загрузки машины
привет.
или по прерываниям от таймера... но об етом лучше наверно расскажет электрик
нет, не расскажет, поскольку ассемблер я знаю, но не до такой степени, чтоб знать за сколько тактов выполняется та или иная команда. это надо лесть в справочники. поповоду команды ноп, пробовал ставить 8 штук, неа, не помогает. за doEvent, спасибо, будем разбираться. похоже, надо делать отслеживание событий.
у меня сейчас идет глобальный проект, пока говорить не буду, но лишь скажу, что это для нашего форума и под FreeBasic и бесплатно. такого под FreeBasic еще не делали. я думаю, что может месяца через три выпущу.
или по прерываниям от таймера... но об етом лучше наверно расскажет электрик
нет, не расскажет, поскольку ассемблер я знаю, но не до такой степени, чтоб знать за сколько тактов выполняется та или иная команда. это надо лесть в справочники. поповоду команды ноп, пробовал ставить 8 штук, неа, не помогает. за doEvent, спасибо, будем разбираться. похоже, надо делать отслеживание событий.
у меня сейчас идет глобальный проект, пока говорить не буду, но лишь скажу, что это для нашего форума и под FreeBasic и бесплатно. такого под FreeBasic еще не делали. я думаю, что может месяца через три выпущу.
electrik- Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург
Re: как в бесконечных циклах избавиться от сильной загрузки машины
О! Здесь уже собрался цвет нашего форума. Даже я вышел из запоя... А "тик" так и не знаем. Ну что же, придёться мне значит гуглить.
Ну и!.. Выяснилось две вещи. Во-первых тик в php, это что-то другое. А вот в линухе:
В php:
ха-ээ-эм. Даже и не знаю как такое перевести. Тик это событие которое происходит после выполнения большинства инструкций. На это событие можно подвесить callback функцию. Или не так...
Ну и!.. Выяснилось две вещи. Во-первых тик в php, это что-то другое. А вот в линухе:
"Тики" -- это отрезки времени, используемые ядром Linux. Это понятие базируется на константе HZ, определение которой вы найдете в /usr/include/asm/param.h.
Величина этой константы различна для разных аппаратных платформ. Так например, для архитектуры i386 один "тик" равен 1/100 секунды, а для платформа Alpha
-- 1/1024 секунды.
В php:
A tick is an event that occurs for every N low-level tickable statements executed by the parser within the declare block. The value for N is specified using
ticks=N within the declare blocks's directive section.
Not all statements are tickable. Typically, condition expressions and argument expressions are not tickable.
The event(s) that occur on each tick are specified using the register_tick_function(). See the example below for more details. Note that more than one event can occur or each tick.
ха-ээ-эм. Даже и не знаю как такое перевести. Тик это событие которое происходит после выполнения большинства инструкций. На это событие можно подвесить callback функцию. Или не так...
Последний раз редактировалось: Eric-S (Чт Июн 04, 2009 7:35 am), всего редактировалось 1 раз(а)
Re: как в бесконечных циклах избавиться от сильной загрузки машины
В Visual Basic'е есть элемент управления Timer. Он вызывает событие Tick через определённый Interval времени (в миллисекундах).
Я люблю VB до слез...
diamass пишет:В VB можно вставить DoEvents и цикл будет срабатывать через раз, чтобы дать приложениям тоже время.visual basic запустить бесконечный цикл, он тоже начинает глючить
Sub Proba()
Dim a As Long
For a = 0 To 1000000000
DoEvents
' Чего-нибудь творим.
Next a
End Sub
И сколько лет эта программа будет крутить цикл? DoEvents - штука очень тормозная! Я с этим столкнулся, когда на VBA (! ) писал программку для попиксельной обработки любого изображения (соседу в институте задали сделать в Ворде программу, запускаемую из макроса, чтобы можно было перебрать попиксельно рисунок и чего-нибудь с этими пикселями понавычеслять - типа фильтра графического выходит, хотя получались довольно интересные эффекты ) Так вот, в цикле (не For, а с переходом на метки после проверки переменных) с DoEvents я не смог дождаться конца обработки картинки (800х600) , а с Слип(1) у меня вышло в районе 3-5 сек. (пиксели перебирал из памяти, возвращаемой Диб-секцией). Так что DoEvents - кака на больших циклах... Вот от такого и мифы о невозможной тормознутости VB
vbman- Сообщения : 52
Дата регистрации : 2008-11-19
Возраст : 42
Откуда : Украина, Кировоград
Re: как в бесконечных циклах избавиться от сильной загрузки машины
Так надо же с умом вставлять!
Если что-то считаеться и нужна скорость, то это один вопрос. Грамотнее будет выделить в отдельный процесс и выставить соответствующий приоритет.
А вот если с интерфейсом работать, с доступом к файлам, базам данных, сайтам, то doevents вполне даже в тему.
Хотя опять же, смотря какие файлы и какие базы.
doevents не притормаживает скорость, а останавливает процес воообще! И если например сидеть и дёргать мышой над окном проги, то расчёты будут завершены гораздо быстрее.
Если что-то считаеться и нужна скорость, то это один вопрос. Грамотнее будет выделить в отдельный процесс и выставить соответствующий приоритет.
А вот если с интерфейсом работать, с доступом к файлам, базам данных, сайтам, то doevents вполне даже в тему.
Хотя опять же, смотря какие файлы и какие базы.
doevents не притормаживает скорость, а останавливает процес воообще! И если например сидеть и дёргать мышой над окном проги, то расчёты будут завершены гораздо быстрее.
Re: как в бесконечных циклах избавиться от сильной загрузки машины
привет. есть решение, хотя и не самое быстрое, видимо, наверное, как в vb. покрайней мере sleep 1, намного медленнее, но на больших циклах, этот вариант расчитывает тоже долго.
код:
#include "windows.bi"
declare sub ProcessMessages()
sub ProcessMessages()
dim wMsg as MSG ' структура сообщений
while TRUE
if not PeekMessage(@wMsg, 0, 0, 0, PM_REMOVE) then exit while
if wMsg.Message <> WM_QUIT then
TranslateMessage(@wMsg)
DispatchMessage(@wMsg)
end if
wend
end sub
for i as integer = -20000000 to 20000000
processmessages
next
beep
а теперь попробуйте следующий код:
for i as integer = -20000000 to 20000000
sleep 1
next
ой как долго придеться ждать, пока закончиться цикл.
у ProcessMessages, есть подводные камни, конечно это не относится к зрячим программистам. в программе экранного доступа jaws, ProcessMessages будет ожидать, пока не начнешь дергать мышой. или не ткнеш клаву. причины. клавиатурный перехватчик, который повидимому, сжирает сообщения. видео перехватчик, но там не понятно. пока не проверил в графическом режиме. в консоли у jaws, в некоторых случаях бывают лаги. например, запрограммированые нажатие одновременно несколько клавиш.
вполне возможно, что в gui приложении, с jaws глюков не будет. ведь как-то пользуемся мы программами sound forge и т.д. возможно там реализован другой способ, но так или иначе, все-равно на сообщениях.
как это можно еще оптимизировать. создать глобальную переменную типа:
dim shared wMsg as MSG ' структура сообщений
и передавать ее процедуре. почему так. дело в том, что при каждом запуске процедуры, создается вот эта структура сообщений, и на это уходит не много, но все же это время.
код:
#include "windows.bi"
declare sub ProcessMessages()
sub ProcessMessages()
dim wMsg as MSG ' структура сообщений
while TRUE
if not PeekMessage(@wMsg, 0, 0, 0, PM_REMOVE) then exit while
if wMsg.Message <> WM_QUIT then
TranslateMessage(@wMsg)
DispatchMessage(@wMsg)
end if
wend
end sub
for i as integer = -20000000 to 20000000
processmessages
next
beep
а теперь попробуйте следующий код:
for i as integer = -20000000 to 20000000
sleep 1
next
ой как долго придеться ждать, пока закончиться цикл.
у ProcessMessages, есть подводные камни, конечно это не относится к зрячим программистам. в программе экранного доступа jaws, ProcessMessages будет ожидать, пока не начнешь дергать мышой. или не ткнеш клаву. причины. клавиатурный перехватчик, который повидимому, сжирает сообщения. видео перехватчик, но там не понятно. пока не проверил в графическом режиме. в консоли у jaws, в некоторых случаях бывают лаги. например, запрограммированые нажатие одновременно несколько клавиш.
вполне возможно, что в gui приложении, с jaws глюков не будет. ведь как-то пользуемся мы программами sound forge и т.д. возможно там реализован другой способ, но так или иначе, все-равно на сообщениях.
как это можно еще оптимизировать. создать глобальную переменную типа:
dim shared wMsg as MSG ' структура сообщений
и передавать ее процедуре. почему так. дело в том, что при каждом запуске процедуры, создается вот эта структура сообщений, и на это уходит не много, но все же это время.
electrik- Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург
Re: как в бесконечных циклах избавиться от сильной загрузки машины
Ща я вам парочку вещей расскажу.
Электрик тут говорил, что привязываться к системе не нужно, но всё же!
Проблема-то возникла из-за чего? Опрос клавиатуры и мыши... Ну и ещё всякое...
Значит для dos проблема не актуальна, т.к. прога кушает 100% времени процессора.
С linux'ом не знаю, наверное там есть своё.
Так что я только про windows.
И так DoEvent. Как я понимаю его прямой аналог, это функция WinAPI Sleep().
Как до неё достучаться из фрибэйсика не знаю, даже не пробовал. Если кто знает, пущай подскажет.
Sleep( msecond as integer )
Суть этой функции, ждать указанное число милисекунд.
Если указать 0, то не будет ждать.
Но фишка её в том, что она работает именно с самим процессом
Sleep(0) , то же самое, что DoEvent
Тут надо немного рассказать о многозадачности.
Процессор разделяет своё время на так называемые кванты.
И винда, каждой проге по очереди даёт квант времени.
Если процесс запрашивает больше, приоритет выше, то квантов даёться больше, а если приоритет низкий, то квантов меньше.
Так вот функция Sleep(0) говорит, что процессу больше не нужен отданный программе квант времени. Винда сразу переключаеться на следующую прогу.
Если же задано время, то, когда винда возвращаеться к нашему процессу, Sleep смотрет прошло время или нет. Если время прошло, то прога продолжает выполняться дальше, иначе, квант считаеться законченным.
Соответственно, говорить тут о точности паузы в милисекундах нельзя. Время может совпасть, а может быть и дольше. В зависимости от приоритета процесса и загруженности системы. Ну и конечно же тактовой частоте процессора.
Вот так вот.
Электрик тут говорил, что привязываться к системе не нужно, но всё же!
Проблема-то возникла из-за чего? Опрос клавиатуры и мыши... Ну и ещё всякое...
Значит для dos проблема не актуальна, т.к. прога кушает 100% времени процессора.
С linux'ом не знаю, наверное там есть своё.
Так что я только про windows.
И так DoEvent. Как я понимаю его прямой аналог, это функция WinAPI Sleep().
Как до неё достучаться из фрибэйсика не знаю, даже не пробовал. Если кто знает, пущай подскажет.
Sleep( msecond as integer )
Суть этой функции, ждать указанное число милисекунд.
Если указать 0, то не будет ждать.
Но фишка её в том, что она работает именно с самим процессом
Sleep(0) , то же самое, что DoEvent
Тут надо немного рассказать о многозадачности.
Процессор разделяет своё время на так называемые кванты.
И винда, каждой проге по очереди даёт квант времени.
Если процесс запрашивает больше, приоритет выше, то квантов даёться больше, а если приоритет низкий, то квантов меньше.
Так вот функция Sleep(0) говорит, что процессу больше не нужен отданный программе квант времени. Винда сразу переключаеться на следующую прогу.
Если же задано время, то, когда винда возвращаеться к нашему процессу, Sleep смотрет прошло время или нет. Если время прошло, то прога продолжает выполняться дальше, иначе, квант считаеться законченным.
Соответственно, говорить тут о точности паузы в милисекундах нельзя. Время может совпасть, а может быть и дольше. В зависимости от приоритета процесса и загруженности системы. Ну и конечно же тактовой частоте процессора.
Вот так вот.
Re: как в бесконечных циклах избавиться от сильной загрузки машины
Теперь вторая вещь. Опять же вспомним, зачем нам это надо?
Обработка сообщений от клавиатуры и мыши...
Не знаю как, плакать или смеяться.
Но то что было хорошо для доса, совсем не подходит для винды.
Я говорю именно о консольных функциях.
Как вы помните, дос однозадачная система, а винда многозадачная.
И это накладывает свой отпечаток на архитектуру программы.
По этому я пришол к выводу, что правильнее для опроса клавиатуры и мыши, да и вообще для работы с консолью использовать соответствующие системные функции.
Проблемы с загрузкой процессора тут же пропадают.
Само же приложение выглядит теперь так:
Это только схема... Если сделаю работающий демо код, на freebasic, то кину. А эта бяка у меня пока не желает компилиться.
Если кто знает почему, то подскажите.
Ну а я пошол спать!
Обработка сообщений от клавиатуры и мыши...
Не знаю как, плакать или смеяться.
Но то что было хорошо для доса, совсем не подходит для винды.
Я говорю именно о консольных функциях.
Как вы помните, дос однозадачная система, а винда многозадачная.
И это накладывает свой отпечаток на архитектуру программы.
По этому я пришол к выводу, что правильнее для опроса клавиатуры и мыши, да и вообще для работы с консолью использовать соответствующие системные функции.
Проблемы с загрузкой процессора тут же пропадают.
Само же приложение выглядит теперь так:
- Код:
#include "windows.bi"
' если произошла ошибка
sub MyErrorExit( msg as string )
MessageBox( 0, strptr(msg), 0, MB_ICONERROR )
end 1
end sub
' событие мыши
sub MouseEventProc( byVal e as MOUSE_EVENT_RECORD )
end sub
' изменение размера
sub ResizeEventProc( byVal e as WINDOW_BUFFER_SIZE_RECORD )
end sub
' событие клавиатуры
sub KeyEventProc( byVal e as KEY_EVENT_RECORD)
end sub
' хэндл буфера ввода
dim as HANDLE hStdin
' буфер чтения событий ввода
dim as INPUT_RECORD irInBuf(1 to 128)
dim as DWORD cNumRead, fdwMode, fdwSaveOldMode, i
' Получим стандартный дескриптор ввода.
hStdin = GetStdHandle(STD_INPUT_HANDLE)
if hStdin = INVALID_HANDLE_VALUE then
MyErrorExit("GetStdHandle")
end if
' Сохраним текущий режим ввода для будущего восстановления
' при выходе из программы.
if not GetConsoleMode(hStdin, @fdwSaveOldMode ) then
MyErrorExit("GetConsoleMode")
end if
' Включим события ввода от мыши и окна.
fdwMode = ENABLE_WINDOW_INPUT or ENABLE_MOUSE_INPUT
if not SetConsoleMode(hStdin, fdwMode ) then
MyErrorExit("SetConsoleMode")
end if
' петля чтения и обработки событий ввода.
do
' Ожидание событий.
if not ReadConsoleInput( _
hStdin, _ ' дескриптор буфера ввода
@irInBuf(1), _ ' буфер, в котором читаем
128, _ ' размер буфера чтения
@cNumRead _ ' число прочитанных записей
) then
MyErrorExit("ReadConsoleInput")
end if
' Направляем события соответствующим обработчикам.
for i = 1 to cNumRead
select case irInBuf(i).EventType
' ввод с клавиатуры
case KEY_EVENT
KeyEventProc( irInBuf(i).Event.KeyEvent )
' ввод от мыши
case MOUSE_EVENT
MouseEventProc( irInBuf(i).Event.MouseEvent )
' изменение размера экранного буфера
case WINDOW_BUFFER_SIZE_EVENT
ResizeEventProc( irInBuf(i).Event.WindowBufferSizeEvent )
' игнорирование событий фокуса
case FOCUS_EVENT
игнорирование событий меню
case MENU_EVENT'
' неучтённое событие
case else
MyErrorExit("unknown event type")
end select
loop
Это только схема... Если сделаю работающий демо код, на freebasic, то кину. А эта бяка у меня пока не желает компилиться.
Если кто знает почему, то подскажите.
Ну а я пошол спать!
Re: как в бесконечных циклах избавиться от сильной загрузки машины
Sleep - она из kernel32, вызыываать ее можно подключив windows.bi.
Sleep замораживает поток откуда она вызвана (попробуйте в отдельном потоке ее вызвать), а DoEvents - просто дает обработаться очереди сообщений приложения. Это разные вещи...
Sleep замораживает поток откуда она вызвана (попробуйте в отдельном потоке ее вызвать), а DoEvents - просто дает обработаться очереди сообщений приложения. Это разные вещи...
vbman- Сообщения : 52
Дата регистрации : 2008-11-19
Возраст : 42
Откуда : Украина, Кировоград
Re: как в бесконечных циклах избавиться от сильной загрузки машины
Что касаеться Sleep, писал точно.
А вот DoEvent не знаю, не работал с ним и не читал про него.
Он вроде бы кроме задержки ещё и ожидает события от окна?
Ну дык Sлееп этого не делает.
Замараживает... Можно и так сказать. Только это слово не объясняет сути.
Sleep именно прерывает квант времени отданный процессу.
т.е. Не расходует процессорного времени, делясь им с другими процессами, которым оно нужнее.
А вот DoEvent не знаю, не работал с ним и не читал про него.
Он вроде бы кроме задержки ещё и ожидает события от окна?
Ну дык Sлееп этого не делает.
Замараживает... Можно и так сказать. Только это слово не объясняет сути.
Sleep именно прерывает квант времени отданный процессу.
т.е. Не расходует процессорного времени, делясь им с другими процессами, которым оно нужнее.
Re: как в бесконечных циклах избавиться от сильной загрузки машины
я так понемаю что слееп эта не та вещ нагружающия процесор, тогда всем проблема в петлях *)
Error- Сообщения : 18
Дата регистрации : 2009-05-24
Re: как в бесконечных циклах избавиться от сильной загрузки машины
Error пишет:я так понемаю что слееп эта не та вещ нагружающия процесор, тогда всем проблема в петлях *)
А причём здесь вообще sleep. Мы сейчас говорим о Sleep()!
Петли же сами по себе нагружать процессор не могут.
Вся заморочка именно в операционной системе, приоритете процесса и времени процессора.
Задача-то даже не в разгрузке петель, а в том, как это сделать.
В прочем, Электрик в первом посту спрашивал для операций типа перекодирования, сжатия и прочих грузных штук.
Тут нужно всё же отделять второй процесс. А в первом повесить отслеживание событий и управление вторым процессом.
Это классическое решение такой задачи.
Re: как в бесконечных циклах избавиться от сильной загрузки машины
как называется пост, какой вообще слееп, если он негрузить что еще есть. ?*(Eric-S пишет:Error пишет:я так понемаю что слееп эта не та вещ нагружающия процесор, тогда всем проблема в петлях *)
А причём здесь вообще sleep. Мы сейчас говорим о Sleep()!
Re: как в бесконечных циклах избавиться от сильной загрузки машины
Eric-S Сегодня в 5:15 pm
Error- Сообщения : 18
Дата регистрации : 2009-05-24
Re: как в бесконечных циклах избавиться от сильной загрузки машины
поясняю ещё раз
функция sleep
приостанавливает процесс и ожидает заданное число секунд или нажатия любой клавиши.
Это функция являеться стандартной для языка basic.
Функция Sleep
прерывает квант времени для выполняемого процесса и ожиданет заданное число милисикунд.
Петля это всего лиш конструкция, повторяющая набор инструкций.
Ни что из этого не грузит процессор.
Процессор грузиться из-за того, что инструкции, заключённые в петле, требуют незначительных ресурсов, но при этом ничего системе не оставляют. В итоге приложение выходит на максимально допустимый для консольного приоритет.
Именно от этого эффекта и нужно избавиться.
Кстати, если я не ошибаюсь, то где-то в настройках встречал два параметра
приоритет для текущего консольного приложения.
приоритет для консольного приложения в неактивном окне.
Может быть ещё и с этим похимичить?
функция sleep
приостанавливает процесс и ожидает заданное число секунд или нажатия любой клавиши.
Это функция являеться стандартной для языка basic.
Функция Sleep
прерывает квант времени для выполняемого процесса и ожиданет заданное число милисикунд.
Петля это всего лиш конструкция, повторяющая набор инструкций.
Ни что из этого не грузит процессор.
Процессор грузиться из-за того, что инструкции, заключённые в петле, требуют незначительных ресурсов, но при этом ничего системе не оставляют. В итоге приложение выходит на максимально допустимый для консольного приоритет.
Именно от этого эффекта и нужно избавиться.
Кстати, если я не ошибаюсь, то где-то в настройках встречал два параметра
приоритет для текущего консольного приложения.
приоритет для консольного приложения в неактивном окне.
Может быть ещё и с этим похимичить?
Страница 1 из 2 • 1, 2
Страница 1 из 2
Права доступа к этому форуму:
Вы не можете отвечать на сообщения
|
|