Re[5]: Процессорное время: Sleep(50) Rulez!
От: dshe  
Дата: 25.02.04 12:32
Оценка: +1 :)
Здравствуйте, gandalf_g, Вы писали:

_>решил капнуть в сторону Sleep, добрался до ntdll а там


_>

INT 2eH: выполнить команду DOS (нет в документации)
_>Это НЕДОКУМЕНТИРОВАННОЕ прерывание выполняет команду DOS, как если бы эта команда была введена в ответ на подсказку DOS.


_>вот вам и ДОС рулез форева. че там дальше происходит остается только догадываться


Ядро операционной системы именно таким образом (через прерывания) и получает управление. Это вовсе не пережиток DOS -- это особенности архитектуры процессора.
--
Дмитро
Re[4]: Процессорное время
От: Sinclair Россия https://github.com/evilguest/
Дата: 01.03.04 17:58
Оценка: :))
Здравствуйте, <Аноним>, Вы писали:
А>Надо же, как быстро Билл Гейтс стал списывать программы.
А>За ним просто не успеть.
А>Андрей.

Да. Хотя бы раз в 10 лет стоит читать MSDN.
... << RSDN@Home 1.1.3 beta 2 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[4]: Процессорное время
От: Sinclair Россия https://github.com/evilguest/
Дата: 17.02.04 08:35
Оценка: 2 (1)
Здравствуйте, dshe, Вы писали:

D>А где? Я не нашел (может надо где-то еще какой-то чекбокс поставить, чтобы приоритет задачи появился в свойствах шортката?)

Упс, виноват. И правда нету. Я обычно если надо управлять приоритетом приложения, запускаю его из командной строки. у команды start есть ключики, которые определяют приортиет (см. help start). Честно говоря, я ожидал, что все они в шорткутах продублированы. Ан нет, только рабочий фолдер там и есть.
... << RSDN@Home 1.1.3 beta 2 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re: Процессорное время
От: WolfHound  
Дата: 06.02.04 14:01
Оценка: :)
Здравствуйте, Rosigma, Вы писали:

R>Привет!

R>Как разрабатывать приложение, чтобы оно не занимало 100% процессорного времени при сложных вычислительных задачах?
R>А то все "висит", пока эти вычисления происходят. Как от этого избавиться?
R>Вопрос общий, но пишу на С++ (может, есть особенности).
Приоритет Idle установить не пробовал?
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: Процессорное время
От: Sinclair Россия https://github.com/evilguest/
Дата: 17.02.04 05:12
Оценка: :)
Здравствуйте, Calve, Вы писали:
C>И еще? приоритет задачи должен где-то указываться. Обычно это пишутт в директивах компилятора в тексте программы.
Нет, обычно это пишут в свойствах шортката, который эту программу запускает.
... << RSDN@Home 1.1.3 beta 2 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[6]: Процессорное время: Sleep(50) Rulez!
От: gandalf_g Россия  
Дата: 25.02.04 12:49
Оценка: :)
Здравствуйте, dshe, Вы писали:

D>Ядро операционной системы именно таким образом (через прерывания) и получает управление. Это вовсе не пережиток DOS -- это особенности архитектуры процессора.


эт ясн пончик, достаточно на ntdll посмотреть, а вот какже Sleep все таки работает, похоже что ядро системы просто пропускает поток при распределении ресурсов проца (пока не окончится задержка), если сей тезис верен, то sleep действительно не нагружает проц, а наоборот освобождает)
Have fun...
Re: Процессорное время
От: Аноним  
Дата: 01.03.04 11:26
Оценка: :)
Здравствуйте, Rosigma, Вы писали:

R>Привет!

R>Как разрабатывать приложение, чтобы оно не занимало 100% процессорного времени при сложных вычислительных задачах?
R>А то все "висит", пока эти вычисления происходят. Как от этого избавиться?
R>Вопрос общий, но пишу на С++ (может, есть особенности).

Длинные вычисления не должны тормозить другие программы в системе и интерфейс самой программы, занимающейся этими вычислениями. Сделать это можно так.

Программа рисует элипсы с помощью функции DrawEllipse( hWnd ); в цикле после старта

#define NUMELLIPSES 2048

i = 0;
bContinue = TRUE;

while( (i++ < NUMELLIPSES) && bContinue )
DrawEllipse( hWnd );

В функции main() обработка сообщений осуществляется следующим образом

while( GetMessage( &msg, NULL, 0, 0 ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}

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

Добавим функцию:

void CheskMessageQueue( void )
{
MSG msg;
while( PeekMessage( &msg, 0,0,0 PM_REMOVE ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}

и перепишем цикл рисования:

while( (i++ < NUMELLIPSES) && bContinue )
{
DrawEllipse( hWnd );
CheckMessageQueue();
}


Словом запуская процедуру или поток с длинными вычислениями надо где-либо в середине этих вычислений освобождать очередь оконных сообщений.


Андрей.
Процессорное время
От: Rosigma Украина http://rosigma.com/
Дата: 06.02.04 13:44
Оценка:
Привет!
Как разрабатывать приложение, чтобы оно не занимало 100% процессорного времени при сложных вычислительных задачах?
А то все "висит", пока эти вычисления происходят. Как от этого избавиться?
Вопрос общий, но пишу на С++ (может, есть особенности).
Roman Yakhymets, http://rosigma.com/, All inside you, ICQ #214741007
Re: Процессорное время
От: Аноним  
Дата: 09.02.04 16:51
Оценка:
Здравствуйте, Rosigma, Вы писали:

R>Привет!

R>Как разрабатывать приложение, чтобы оно не занимало 100% процессорного времени при сложных вычислительных задачах?
R>А то все "висит", пока эти вычисления происходят. Как от этого избавиться?
R>Вопрос общий, но пишу на С++ (может, есть особенности).
В отдельном потоке...
Re[2]: Процессорное время
От: ArtDenis Россия  
Дата: 09.02.04 17:48
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Приоритет Idle установить не пробовал?


Самое интересное, что даже в этом случае оно будет съедать 100% процессора
... << RSDN@Home 1.1.2 stable >>
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[3]: Процессорное время
От: Sinclair Россия https://github.com/evilguest/
Дата: 09.02.04 18:58
Оценка:
Здравствуйте, ArtDenis, Вы писали:
AD>Самое интересное, что даже в этом случае оно будет съедать 100% процессора
Зато "все" висеть не будет
... << RSDN@Home 1.1.3 beta 2 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re: Процессорное время
От: AndreyFedotov Россия  
Дата: 10.02.04 09:11
Оценка:
Здравствуйте, Rosigma, Вы писали:

R>Привет!

R>Как разрабатывать приложение, чтобы оно не занимало 100% процессорного времени при сложных вычислительных задачах?
R>А то все "висит", пока эти вычисления происходят. Как от этого избавиться?
R>Вопрос общий, но пишу на С++ (может, есть особенности).

Простейшее решение:
while( bItShouldWork )
{
    Sleep( TimeSleep );
    SuspendAllThreads();
    Sleep( TimeWork );
    ResumeAllThreads();
}

В этом случае использование процессора составит (грубо) от 0 до TimeWork / ( TimeSleep + TimeWork ) времени.
Re[2]: Процессорное время
От: jazzer Россия Skype: enerjazzer
Дата: 13.02.04 09:18
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, Rosigma, Вы писали:


R>>Привет!

R>>Как разрабатывать приложение, чтобы оно не занимало 100% процессорного времени при сложных вычислительных задачах?
R>>А то все "висит", пока эти вычисления происходят. Как от этого избавиться?
R>>Вопрос общий, но пишу на С++ (может, есть особенности).
WH>Приоритет Idle установить не пробовал?

Достаточно даже below normal :)
По крайней мере, я такой приоритет выставляю в виртуальном дубе, когда конверчу видео (прога работает порядка часа), и у меня ничего не тормозит.

А у винампа наоборот выставляю high, тогда он не затыкается при скроллинге и прочей байде, которую я с компом творю :)
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: Процессорное время
От: Calc Россия  
Дата: 14.02.04 21:43
Оценка:
Здравствуйте, Rosigma, Вы писали:

R>Привет!

R>Как разрабатывать приложение, чтобы оно не занимало 100% процессорного времени при сложных вычислительных задачах?
R>А то все "висит", пока эти вычисления происходят. Как от этого избавиться?
R>Вопрос общий, но пишу на С++ (может, есть особенности).

Значит не читаем Рихтера
Хорошо описана работа планировщика задач
Берём и создаём отдельный поток для вычислительных задач и делаем ему приоритет ниже нормального.
О синхронизации ищите информацию сами, помоему тут где то в статьях должна валяться, так же была в журнале Программист (programme.ru момоему).
Флудеров много тут развелось
Re: Процессорное время
От: Calve США  
Дата: 16.02.04 11:15
Оценка:
Здравствуйте, Rosigma, Вы писали:

R>Привет!

R>Как разрабатывать приложение, чтобы оно не занимало 100% процессорного времени при сложных вычислительных задачах?
R>А то все "висит", пока эти вычисления происходят. Как от этого избавиться?
R>Вопрос общий, но пишу на С++ (может, есть особенности).


DВ системе должен быть какая-то галочка, может движок. (В ОС). Win 2000, по умолчанию, похоже ресурсы процессора распределяет автоматически равномерно между задачами.
И еще? приоритет задачи должен где-то указываться. Обычно это пишутт в директивах компилятора в тексте программы.
Re[3]: Процессорное время
От: dshe  
Дата: 17.02.04 08:07
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, Calve, Вы писали:

C>>И еще? приоритет задачи должен где-то указываться. Обычно это пишутт в директивах компилятора в тексте программы.
S>Нет, обычно это пишут в свойствах шортката, который эту программу запускает.

А где? Я не нашел (может надо где-то еще какой-то чекбокс поставить, чтобы приоритет задачи появился в свойствах шортката?)
--
Дмитро
Re: Процессорное время: Sleep(50) Rulez!
От: Gaperton http://gaperton.livejournal.com
Дата: 18.02.04 17:23
Оценка:
Здравствуйте, Rosigma, Вы писали:

R>Привет!

R>Как разрабатывать приложение, чтобы оно не занимало 100% процессорного времени при сложных вычислительных задачах?
R>А то все "висит", пока эти вычисления происходят. Как от этого избавиться?
R>Вопрос общий, но пишу на С++ (может, есть особенности).

Гы-гы, поставь Sleep(50) внутри вычислительных циклов

А на самом деле вычисления надо запускать отдельным потоком. И 100% процессорного времени здесь совершенно не причем (что станет очевидно, если использовать Sleep(50) ).
Re[2]: Процессорное время: Sleep(50) Rulez!
От: Gaperton http://gaperton.livejournal.com
Дата: 18.02.04 17:26
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Здравствуйте, Rosigma, Вы писали:


R>>Привет!

R>>Как разрабатывать приложение, чтобы оно не занимало 100% процессорного времени при сложных вычислительных задачах?
R>>А то все "висит", пока эти вычисления происходят. Как от этого избавиться?
R>>Вопрос общий, но пишу на С++ (может, есть особенности).

G>Гы-гы, поставь Sleep(50) внутри вычислительных циклов


G>А на самом деле вычисления надо запускать отдельным потоком. И 100% процессорного времени здесь совершенно не причем (что станет очевидно, если использовать Sleep(50) ).


А этому потоку легко можно понизить приоритет.
Re[2]: Процессорное время: Sleep(50) Rulez!
От: Аноним  
Дата: 20.02.04 10:52
Оценка:
Здравствуйте, Gaperton, Вы писали:


G>Гы-гы, поставь Sleep(50) внутри вычислительных циклов


G>А на самом деле вычисления надо запускать отдельным потоком. И 100% процессорного времени здесь совершенно не причем (что станет очевидно, если использовать Sleep(50) ).

Да уже Sleep(0) дает хороший эффект
Re[2]: Процессорное время: Sleep(50) Rulez!
От: gandalf_g Россия  
Дата: 20.02.04 11:25
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Гы-гы, поставь Sleep(50) внутри вычислительных циклов


G>А на самом деле вычисления надо запускать отдельным потоком. И 100% процессорного времени здесь совершенно не причем (что станет очевидно, если использовать Sleep(50) ).


You have to be careful when using Sleep and code that directly or indirectly creates windows. If a thread creates any windows, it must process messages.

Sleep в этих случаях жрет проц не хуже обычного цикла, также приложение просто виснет пока Sleep не завершится

лучше таки использовать отдельный поток с уменьшенным приоритетом
Have fun...
Re[3]: Процессорное время: Sleep(50) Rulez!
От: Gaperton http://gaperton.livejournal.com
Дата: 25.02.04 11:28
Оценка:
Здравствуйте, gandalf_g, Вы писали:

_>Здравствуйте, Gaperton, Вы писали:


G>>Гы-гы, поставь Sleep(50) внутри вычислительных циклов


G>>А на самом деле вычисления надо запускать отдельным потоком. И 100% процессорного времени здесь совершенно не причем (что станет очевидно, если использовать Sleep(50) ).


_>

You have to be careful when using Sleep and code that directly or indirectly creates windows. If a thread creates any windows, it must process messages.

_>Sleep в этих случаях жрет проц не хуже обычного цикла, также приложение просто виснет пока Sleep не завершится
Это, кстати, не одно и то же. Приложение (вернее, поток) виснет, но проц при этом (!) — не жрет! Время отклика и загрузка процессора — разные вещи, что и должен был иллюстрировать пример со Sleep. Это хорошо, если процессор загружен на 100% по делу.

_>лучше таки использовать отдельный поток с уменьшенным приоритетом

Отдельный. А приоритет уменьшать только по показаниям в соответствии с клинической картиной. Самолечением не заниматься
Re[4]: Процессорное время: Sleep(50) Rulez!
От: gandalf_g Россия  
Дата: 25.02.04 12:25
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Это, кстати, не одно и то же. Приложение (вернее, поток) виснет, но проц при этом (!) — не жрет! Время отклика и загрузка процессора — разные вещи, что и должен был иллюстрировать пример со Sleep. Это хорошо, если процессор загружен на 100% по делу.


решил капнуть в сторону Sleep, добрался до ntdll а там

.text:77F89153 ZwDelayExecution proc near              ; CODE XREF: sub_77F85C00+3Dp
.text:77F89153                                         ; .text:77F92899p ...
.text:77F89153 
.text:77F89153 arg_0           = byte ptr  4
.text:77F89153 
.text:77F89153                 mov     eax, 32h        ; NtDelayExecution
.text:77F89158                 lea     edx, [esp+arg_0]
.text:77F8915C                 int     2Eh             ; DOS 2+ internal - EXECUTE COMMAND
.text:77F8915C                                         ; DS:SI -> counted CR-terminated command string
.text:77F8915E                 retn    8
.text:77F8915E ZwDelayExecution endp


INT 2eH: выполнить команду DOS (нет в документации)
Это НЕДОКУМЕНТИРОВАННОЕ прерывание выполняет команду DOS, как если бы эта команда была введена в ответ на подсказку DOS.


вот вам и ДОС рулез форева. че там дальше происходит остается только догадываться
Have fun...
Re[5]: Процессорное время: Sleep(50) Rulez!
От: Gaperton http://gaperton.livejournal.com
Дата: 25.02.04 12:47
Оценка:
Здравствуйте, gandalf_g, Вы писали:

_>Здравствуйте, Gaperton, Вы писали:


G>>Это, кстати, не одно и то же. Приложение (вернее, поток) виснет, но проц при этом (!) — не жрет! Время отклика и загрузка процессора — разные вещи, что и должен был иллюстрировать пример со Sleep. Это хорошо, если процессор загружен на 100% по делу.


_>решил капнуть в сторону Sleep, добрался до ntdll а там


_>
.text:77F89153 ZwDelayExecution proc near              ; CODE XREF: sub_77F85C00+3Dp
_>.text:77F89153                                         ; .text:77F92899p ...
_>.text:77F89153 
_>.text:77F89153 arg_0           = byte ptr  4
_>.text:77F89153 
_>.text:77F89153                 mov     eax, 32h        ; NtDelayExecution
_>.text:77F89158                 lea     edx, [esp+arg_0]
_>.text:77F8915C                 int     2Eh             ; DOS 2+ internal - EXECUTE COMMAND
_>.text:77F8915C                                         ; DS:SI -> counted CR-terminated command string
_>.text:77F8915E                 retn    8
_>.text:77F8915E ZwDelayExecution endp


_>

INT 2eH: выполнить команду DOS (нет в документации)
_>Это НЕДОКУМЕНТИРОВАННОЕ прерывание выполняет команду DOS, как если бы эта команда была введена в ответ на подсказку DOS.


_>вот вам и ДОС рулез форева. че там дальше происходит остается только догадываться


Давайте я попробую догадаться . Дальше, мне думается, там происходит то же самое, что и во всех остальных операционных системах, а именно: текущий поток(процесс) на заданное время исключается из цикла работы планировщика задач, что приводит к тому, что поток не получает ни одного кванта процессорного времени заданное количество милисекунд. А дальше как получится, на общих основаниях
Re[6]: Процессорное время: Sleep(50) Rulez!
От: gandalf_g Россия  
Дата: 25.02.04 12:52
Оценка:
Здравствуйте, Gaperton, Вы писали:

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


кажись я повторился) итог вообщим прост, юзайте sleep как можно чаще =)
Have fun...
Re[2]: Процессорное время
От: Аноним  
Дата: 01.03.04 11:57
Оценка:
А>т.к. в цикле не извлекаются сообщения из системной очереди, другие программы не могут их извлекать для себя. Все ждут завершения рисования 2048-и элипсов.

Это мы про win3.x?
Bли под win9x это до сих пор так?

У каждой программы (более того, у каждого thread'а) своя очередь сообщений.
Re[2]: Процессорное время
От: Sinclair Россия https://github.com/evilguest/
Дата: 01.03.04 12:02
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>В функции main() обработка сообщений осуществляется следующим образом


А>while( GetMessage( &msg, NULL, 0, 0 ) )

А>{
А> TranslateMessage( &msg );
А> DispatchMessage( &msg );
А>}

А>т.к. в цикле не извлекаются сообщения из системной очереди, другие программы не могут их извлекать для себя. Все ждут завершения рисования 2048-и элипсов.

Это перестало иметь отношение к действительности примерно 10 лет назад, с выходом Windows 95. То, о чем вы говорите, имело место только под Win16.
... << RSDN@Home 1.1.3 beta 2 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[3]: Процессорное время
От: Аноним  
Дата: 01.03.04 12:25
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, <Аноним>, Вы писали:


S>Это перестало иметь отношение к действительности примерно 10 лет назад, с выходом Windows 95. То, о чем вы говорите, имело место только под Win16.



Надо же, как быстро Билл Гейтс стал списывать программы.

За ним просто не успеть.

Андрей.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.