Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Delphi (http://forum.oszone.net/showthread.php?t=30740)

Roman Go 10-11-2002 17:31 209920

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

Kamiur 11-11-2002 01:04 209921

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

Roman Go 11-11-2002 06:22 209922

Kamiur

Цитата:

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

Kamiur 11-11-2002 11:11 209923

Хм... Да так прямо и пользоваться.
Ну например...

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 209924

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

Roman Go 12-11-2002 03:57 209925

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

Kamiur 12-11-2002 11:05 209926

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

vasketsov 12-11-2002 15:28 209927

Roman Go
Да забей.
Бери класс приоритета как высокий, реалтайм не нужен, думается.

Roman Go 24-12-2002 12:08 209928

Я значит что делал: в предложенный код 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 секунд нажать не мог (во время работы программы) в отличие от работы без установления приоритета


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

vasketsov 25-12-2002 15:48 209929

Roman Go
Цитата:

почему я в label1 не вижу в течении этих же самых 30 секунд в процессе
Потому как сообщения о перерисовке не обрабатываются, что это было так, вызывай в цикле Application.ProcessMessages, примерно 10 раз в секунду будет достаточно, то есть, в самом внутреннем цикле лучше этого не делать.


Время: 15:57.

Время: 15:57.
© OSzone.net 2001-