Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Процессы real-time


Автор: Addmin 8.9.2006, 17:10
Здравствуйте!

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

Всем откликнувшимся заранее благодарен! 

Автор: BUGOR 8.9.2006, 17:16
Что значит активному процессу? SetPriorityClass & GetPriorityClass пробовал? Попробуйsmile

Автор: Addmin 8.9.2006, 18:16
Ну, насколько я понял, это процессу, с которым пользователь на данный момент работает.
А вообще спасибо, правда, натолкнул меня на мысль. Сейчас попробую...

Автор: Yanis 11.9.2006, 17:51
Addmin
Просто определяешь окно какого процесса сейчас активно, получаешь его PID, открываешь процесс и используешь специальные функции как сказал BUGOR. Примеры всех действий можно найти на форуме в этом же разделе или в DRKB. Если нужен пример такой проги на masm32, то отпиши, попытаюсь вспомнить как называется smile

Автор: Addmin 12.9.2006, 08:06
Спасибо, Yanis, спасибо! Так я сделал.  

Автор: Addmin 12.9.2006, 10:56
Хм, а вот с определением PID активного приложения всё не так уж и просто...
Как бы то ни было, ни в DRKB, ни на форуме я ответа не нашёл.
Yanis, не мог бы дать ссылку или сам код?

Автор: Romikgy 12.9.2006, 12:48
GetActiveWindow
GetWindowThreadProcessId
и те пид активного приложения или что?

Автор: Addmin 12.9.2006, 14:35
Да, именно PID активного приложения.

Автор: Yanis 12.9.2006, 14:49
Цитата(Addmin @  12.9.2006,  15:35 Найти цитируемый пост)
Да, именно PID активного приложения.

PID бвает только у процессов. Собственно в это йабривеатуре первое слово и есть Process. Тебе наверное нужно узнать PID процесса потоку которого принадлежит активное окно.

Автор: Addmin 12.9.2006, 15:01
Да-да, Process Identificator (Identifier?) процесса активного приложения. Надеюсь, теперь я правильно сформулировал smile

Автор: Romikgy 12.9.2006, 15:15
Код

var pid:DWORD;

GetWindowThreadProcessId(GetActiveWindow,pid);

Автор: Yanis 12.9.2006, 15:16
Цитата(Romikgy @  12.9.2006,  13:48 Найти цитируемый пост)
GetActiveWindow

Цитата
The GetActiveWindow function retrieves the window handle to the active window associated with the thread that calls the function.


Скорее всего придётся перебирать все окна и определять активное, окно. А уже потом из этого окна узнавать PID его процесса. Fedia этим уже занимался совершенно недавно.

Автор: Addmin 13.9.2006, 03:02
Но ведь, если не ошибаюсь, Fedia искал активное окно приложения? PID приложения был ему известен.

Автор: Fedia 13.9.2006, 03:35
Цитата(Addmin @  8.9.2006,  17:10 Найти цитируемый пост)
Попалась мне на глаза одна программа, которая ускоряет работу компьютера, выставляя активному сейчас процессу высочайший приоритет или приоритет реального времени.

Немного оффтопик, но все равно вопрос: на самом деле происходит существенное ускорение ? Ведь если в системе расходует ресурсы процессора одно приложение, то выставление такого приоритета прибавит ему 1-2% за счет того, что заберет их у самой системы. Кроме того расходовать ресурсы процессора могут несколько приложений одновременно. Да и управление над системой практически потеряется, если передать све ресурсы одному процессу.

Что ты считаешь активным приложением ? То, чье окно активно, или то, которое расходует ресурсы процессора ? Ведь то, что написал Yanis
Цитата(Yanis @  12.9.2006,  14:49 Найти цитируемый пост)
Тебе наверное нужно узнать PID процесса потоку которого принадлежит активное окно.
 и ты
Цитата(Addmin @  12.9.2006,  15:01 Найти цитируемый пост)
Process Identificator (Identifier?) процесса активного приложения
 можно трактовать по разному.

Цитата(Addmin @  13.9.2006,  03:02 Найти цитируемый пост)
Fedia искал активное окно приложения?

Да, а тебе, скорее всего, предстоит обратная задача.

Автор: Addmin 13.9.2006, 07:28
Цитата(Fedia @  13.9.2006,  03:35 Найти цитируемый пост)
Немного оффтопик, но все равно вопрос: на самом деле происходит существенное ускорение ? Ведь если в системе расходует ресурсы процессора одно приложение, то выставление такого приоритета прибавит ему 1-2% за счет того, что заберет их у самой системы. Кроме того расходовать ресурсы процессора могут несколько приложений одновременно. Да и управление над системой практически потеряется, если передать све ресурсы одному процессу.

Ты прав, если процесс не занимается сложными вычислениями, то на нём много не выиграешь. Но, к примеру, WinRAR значительно ускоряет добавление файлов в архив (на больших архивах видно даже "невооружённым глазом"). Ну, все ресурсы, конечно, никто приложению выдавать не будет, но выделить его среди приложений с приоритетом "Normal" всё-таки можно.
 


Цитата(Fedia @  13.9.2006,  03:35 Найти цитируемый пост)
Что ты считаешь активным приложением ? То, чье окно активно, или то, которое расходует ресурсы процессора ? Ведь то, что написал Yanis

Да, именно то, что сказал Yanis. Я не слишком хорошо пока разобрался в этих терминах, так что прошу меня поправлять, если что.



Цитата(Fedia @  13.9.2006,  03:35 Найти цитируемый пост)
Да, а тебе, скорее всего, предстоит обратная задача. 

Чтож, если сегодня не найду решения, то придётся выпускать проект без него.

Автор: Yanis 13.9.2006, 11:03
Addmin
Какой информации тебе недостаточно, что бы написать то что ты хочешь? Растолкую ещё раз. Для определения описателя активного окна используется GetForegroundWindow, далее узнаешь PID с помощью GetWindowThreadProcessId, затем открываешь процесс OpenProcess и меняешь приоритет процесса используя SetPriorityClass.

Ты сказал, что пока что не силён в терминологии. Сделай всё по пунктам, как в моём описании и сразу научишься smile

Автор: Fedia 13.9.2006, 11:17
Цитата(Addmin @  13.9.2006,  07:28 Найти цитируемый пост)
Чтож, если сегодня не найду решения, то придётся выпускать проект без него.

Попробуй определять PID активного окна таким образом:
Код

function GetActiveWindowPID: Cardinal;
var
  NextW, ActWH: HWND;
  WS: Integer;
begin
  NextW:=GetWindow(Screen.ActiveForm.Handle, GW_HWNDFIRST);
  repeat
    NextW:=GetNextWindow(NextW, GW_HWNDNEXT);
    if (NextW<>0) and (not IsIconic(NextW)) and IsWindowVisible(NextW) then
    begin
      WS:=GetWindowLong(NextW, GWL_STYLE);
      if WS and WS_CAPTION  = WS_CAPTION  then
      begin
        ActWH:=NextW;
        ShowWindow(ActWH, SW_HIDE);
        Break;
      end;
    end;
  until NextW=0;
  GetWindowThreadProcessId(ActWH, Result);
end;

Если будет определять не все нужные тебе окна, то посмотри стили окон в MSDN. Например, стиль WS_CAPTION означает:
Цитата

WS_CAPTION 
Creates a window that has a title bar (includes the WS_BORDER style).


Добавлено @ 11:22 
Цитата(Yanis @  13.9.2006,  11:03 Найти цитируемый пост)
GetForegroundWindow

Все оказывается было проще smile

Автор: Yanis 13.9.2006, 11:26
Fedia
А почему не:
Код
var
  dwPID: DWORD;
begin
  GetWindowThreadProcessId(GetForegroundWindow, @dwPID);
end;

Автор: Fedia 13.9.2006, 11:29
Цитата(Yanis @  13.9.2006,  11:26 Найти цитируемый пост)
Fedia
А почему не:

См. выше. Для этого нужно было помнить про GetForegroundWindow  smile

Добавлено @ 11:33 
Зато при небольшой модификации в моей функции можно фильтровать типы искомых окон. Хотя это, скорее всего, автору ветки нафиг и не нужно smile

Автор: Addmin 13.9.2006, 12:10
Ура! Работает! 

Ребята, не знаю даже, как вас благодарить!
Придумаю  smile 

А пока примите просто слова моей огромной благодарности и моего громадного уважения!  smile 
 

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