Показать полную графическую версию : Delphi
Roman Go
10-11-2002, 17:31
в программе я провожу статические расчеты и нужно выполнять множество математических действий, которые компьютер порой не очень то переваривает, так вот я хотел узнать как в Delphi5 можно установить приоритет программы таким образом, чтобы она использовала все ресурсы компьютера... чтобы максимально минимизировать время работы программы, то есть расчетов
SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS); - это устанавливается максимально возможный приоритет процесса в целом,
SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL); - это приоритет потока.
Как ни странно, главное при установке приоритетов - не переборщить, ведь виндоусу себя тоже считать надо, и если своему потоку (тем более интенсивно работающему) выставить максимальные приоритеты, то виндоус практически зависнет.
Roman Go
11-11-2002, 06:22
Kamiur
виндоус практически зависнет.
Самое главное это чтобы расчеты проводились и если компьютер выйдет из подвешенного состояния после завершения работы программы, то это на данный момент, что мне нужно, можешь подробнее расказать как пользоваться приведенными процедурами, а то как-то методом тыка не очень хочется их осваивать, а справку на английском прочитать проблемно... было бы здорово если бы был живой примерчик...
Хм... Да так прямо и пользоваться.
Ну например...
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 Я лично из твоих слов как обычно ничего не понял, может разъяснишь по подробнее, мне что не следует и браться за эту штуку или нужно таки что-нибудь другое использовать...?
Ну уж если тут действительно все так не просто, то пишите под ДОС (и на фортране), там проблем с многозадачностью нет в принципе.
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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.