Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Приоритет программы


Автор: profesiachuvak 16.12.2009, 13:24
Здравствуйте друзья,  начну с кода:

var 
Код


ProcessID: DWORD;
ProcessHandle: THandle;
ThreadHandle: THandle;

begin

ProcessID := GetCurrentProcessID;
  ProcessHandle := OpenProcess(PROCESS_SET_INFORMATION,
    false, ProcessID);

SetPriorityClass(ProcessHandle, HIGH_PRIORITY_CLASS);
ThreadHandle := GetCurrentThread;
SetThreadPriority(ThreadHandle,THREAD_PRIORITY_TIME_CRITICAL);


Если в  SetPriorityClass указать HIGH_PRIORITY_CLASS , то загрузка процессора при выполнении программы 100%. Мне нужен максимально высокий приоритет моей программы, но не до такой степени.
Вопрос в следующем: 
1. Какой же класс приоритета будет оптимальным? 
2. Какие ещё классы приоритета существуют? (есть ли числовой эквивалент  HIGH_PRIORITY_CLASS и др.) 
3.Грамотно ли вообще реализован приоритет в моём коде?
4.Нужно ли устанавливать приоритет потока в данном случае?

Автор: Демо 16.12.2009, 15:11
Сразу же несколько вопросов.

Цитата(profesiachuvak @  16.12.2009,  13:24 Найти цитируемый пост)
Мне нужен максимально высокий приоритет моей программы


Для чего?


Цитата(profesiachuvak @  16.12.2009,  13:24 Найти цитируемый пост)
Грамотно ли вообще реализован приоритет в моём коде?

Опять же - чего добиться хочешь?
С точки зрения синтаксиса - всё грамотно.


Цитата(profesiachuvak @  16.12.2009,  13:24 Найти цитируемый пост)
Нужно ли устанавливать приоритет потока в данном случае?

В каком?

Ты задаёшь вопросы, но не говоришь для чего это нужно.

Автор: profesiachuvak 18.12.2009, 18:16
Цитата(Демо @ 16.12.2009,  15:11)
Ты задаёшь вопросы, но не говоришь для чего это нужно.

Прошу прощения, косяк с интернетом был.

Отвечаю на ваши вопросы : в моей программе реализован сверхточный таймер (до 10 мкс), считает он выполнение процедуры. Проблема в том что с обычным приоритетом возникает погрешность в вычислении точного времени. То есть необходимая точность обеспечивается только с высоким приоритетом. 
Для сравнении : 
Приоритет который я указал в коде : время выполнения  8 +/- 2 мкс
Без указания приоритета : время выполнения 8 +/- 9 мкс (приблизительно, но разбежка ощутима)

Вот я и хотел бы узнать что именно мне надо. Вопросы остаются те же.

Автор: bems 18.12.2009, 18:45
стопроцентная загрузка будет при любом приоритете, если программе есть что делать и она не простаивает. Приоритет влияет только на то, кто получит время при конкуренции.

Автор: ~FoX~ 18.12.2009, 22:39
profesiachuvak, Что бы снизить погрешность REALTIME_PRIORITY_CLASS, точность что надо... В остальном:
1. На разных машинах будут разные результаты в том числе и погрешность.
2. Более того при разных запущенных приложениях показатели будут разными.
Из 1 и 2 => Выбрать подходящий можно только империческим путем...

Автор: profesiachuvak 19.12.2009, 14:40
Цитата(~FoX~ @  18.12.2009,  22:39 Найти цитируемый пост)
1. На разных машинах будут разные результаты в том числе и погрешность.
2. Более того при разных запущенных приложениях показатели будут разными.
Из 1 и 2 => Выбрать подходящий можно только империческим путем... 



~FoX~ , Вы говорите простые истины. Если на конфигурацию компьютера я повлиять не могу, то на победу в конкуренции между приложениями я могу надеяться. 

Цитата(~FoX~ @  18.12.2009,  22:39 Найти цитируемый пост)
Что бы снизить погрешность REALTIME_PRIORITY_CLASS


За это спасибо, сейчас попробую.


Цитата(bems @  18.12.2009,  18:45 Найти цитируемый пост)
стопроцентная загрузка будет при любом приоритете, если программе есть что делать и она не простаивает. Приоритет влияет только на то, кто получит время при конкуренции. 


bems, Первое предложение не понятно. Вы хотите сказать, что при выполнении программы ресурс процессора полностью отдаётся только ей? Вы не правы что при любом приоритете загрузка программы одинаковая, проверьте это не так.
 smile 

Автор: bems 21.12.2009, 00:09
Цитата(profesiachuvak @  19.12.2009,  14:40 Найти цитируемый пост)
Вы хотите сказать, что при выполнении программы ресурс процессора полностью отдаётся только ей?
Нет, не хочу. Приоритет прямо влияет на то кому достанется больше процессора. Но даже если у вас самый низкий приоритет, и вам есть что делать загрузка процессора (предположим для простоты что он один в системе) будет 100%

Цитата(profesiachuvak @  19.12.2009,  14:40 Найти цитируемый пост)
Вы не правы что при любом приоритете загрузка программы одинаковая
Прав. Вторая цитата говорит не совсем о том же о чем первая.

Предположим что у тебя самый низкий приоритет. Когда нет конкурирующих потоков, то даже с этим приоритетом ты получишь процессорное время, и загрузка будет 100% до тех пор, пока не появится поток с более высоким. Когда управление получает этот поток, то ты голодаешь, да, но процессор-то не простаивает. Он выполняет этот высокоприоритетный поток. Загрузка остается высокой. Когда ему больше нечего делать, то снова процессор занят тобой. Он будет простаивать тольео там, где все потоки находятся в ожидании. Поскольку речь о продолжительной фоновой работе, то ты всегда готов действовать, занчит загрузка 100%

Автор: profesiachuvak 21.12.2009, 00:27
bems, Не буду с Вами спорить, я не сведущ в физике процесса загрузки процессора. Просто то что Вы писали в первом своём сообщении, скорее была просто отписка, поэтому это вызвало у меня негодование и непонимание. А вообще мы отошли от темы. 

Вопросы остались открытыми.

Автор: Демо 21.12.2009, 01:37
Цитата(profesiachuvak @  18.12.2009,  18:16 Найти цитируемый пост)
 считает он выполнение процедуры


Что конкретно считает? Если вычисляет, какое время выполняется некий код, то для этого не нужно ни таймеры, ни приоритеты изменять...

Автор: profesiachuvak 21.12.2009, 15:00
Цитата(Демо @  21.12.2009,  01:37 Найти цитируемый пост)
Что конкретно считает? Если вычисляет, какое время выполняется некий код, то для этого не нужно ни таймеры, ни приоритеты изменять... 


Демо, Ваше предложение как подчитать с какой частотой вкл\выкл контакт на LPT порту ? Именно эту процедуру я и замеряю.

Автор: dvamaster 22.12.2009, 08:20
чтоб не было 100% загрузки надо модифицировать поток обоспечивающий таймер

есть http://msdn.microsoft.com/en-us/library/dd743609(VS.85).aspx

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)