PDA

Показать полную графическую версию : Delphi


Roman Go
10-11-2002, 17:31
в программе я провожу статические расчеты и нужно выполнять множество математических действий, которые компьютер порой не очень то переваривает, так вот я хотел узнать как в Delphi5 можно установить приоритет программы таким образом, чтобы она использовала все ресурсы компьютера... чтобы максимально минимизировать время работы программы, то есть расчетов

Kamiur
11-11-2002, 01:04
SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS); - это устанавливается максимально возможный приоритет процесса в целом,
SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL); - это приоритет потока.
Как ни странно, главное при установке приоритетов - не переборщить, ведь виндоусу себя тоже считать надо, и если своему потоку (тем более интенсивно работающему) выставить максимальные приоритеты, то виндоус практически зависнет.

Roman Go
11-11-2002, 06:22
Kamiur

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

Kamiur
11-11-2002, 11:11
Хм... Да так прямо и пользоваться.
Ну например...

var PriorityClass, Priority: Integer;
...
PriorityClass := GetPriorityClass(GetCurrentProcess);
Priority := GetThreadPriority(GetCurrentThread);
// Сохранение приоритетов по умолчанию, чтобы можно было потом восстановить
SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
//Установка приоритета текущего процесса
SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL);
//Установка приоритета текущего потока
...  Ваши вычисления ...
SetThreadPriority(GetCurrentThread, Priority);
SetPriorityClass(GetCurrentProcess, PriorityClass);
// Восстановление приоритетов по умолчанию

Ну а насчет справки - это вы зря: раз уж вы взялись что-то программировать, то английский, imho, это первое, что надо освоить...


Добавлено:

Да, и еще... Если операционка NT (2000, XP), то у пользователя, запускающего такую программу, конечно, должны быть соответствующие права (называется, по-моему, "Профилирование одного процесса").

vasketsov
11-11-2002, 17:13
Roman Go
Kamiur
Привилегия увеличения квот должна быть.
Если ее нет - приоритет будет только высокий, но не реального времени.

Roman Go
12-11-2002, 03:57
vasketsov Я лично из твоих слов как обычно ничего не понял, может разъяснишь по подробнее, мне что не следует и браться за эту штуку или нужно таки что-нибудь другое использовать...?

Kamiur
12-11-2002, 11:05
Ну уж если тут действительно все так не просто, то пишите под ДОС (и на фортране), там проблем с многозадачностью нет в принципе.

vasketsov
12-11-2002, 15:28
Roman Go
Да забей.
Бери класс приоритета как высокий, реалтайм не нужен, думается.

Roman Go
24-12-2002, 12:08
Я значит что делал: в предложенный код Kamiurа вставлял вот такой цикл

for i:=1 to 10000 do
      for j:=1 to 1000 do
        for q:=1 to 1000 do
          begin end;

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

label1.caption:='в процессе';
t:=time;//самое начало модуля
{- - - - - - - - - - -}
label1.caption:='конец';
label2.caption:=timetostr(t-time);//самый конец модуля


потом такой же цикл запускал, но уже без данного кода и получил те же 30 секунд, то есть реального выигрыша я никакого не получил, хотя при использовании предложенного кода приоритет работы моей программы действительно был высоким так как я даже на пуск в течение 30 секунд нажать не мог (во время работы программы) в отличие от работы без установления приоритета
[hr]
заодно вопрос, почему я в label1 не вижу в течении этих же самых 30 секунд в процессе и как мне сделать чтобы я его видел... странно как-то это все работает, не по порядку..

vasketsov
25-12-2002, 15:48
Roman Go
почему я в label1 не вижу в течении этих же самых 30 секунд в процессе
Потому как сообщения о перерисовке не обрабатываются, что это было так, вызывай в цикле Application.ProcessMessages, примерно 10 раз в секунду будет достаточно, то есть, в самом внутреннем цикле лучше этого не делать.




© OSzone.net 2001-2012