まずBELOW_NORMAL_PRIORITY_CLASSとABOVE_NORMAL_PRIORITY_CLASSの定義を追加します。
{$IF RTLVersion < 24}
const
BELOW_NORMAL_PRIORITY_CLASS = $00004000;
{$EXTERNALSYM ABOVE_NORMAL_PRIORITY_CLASS}
ABOVE_NORMAL_PRIORITY_CLASS = $00008000;
{$EXTERNALSYM ABOVE_NORMAL_PRIORITY_CLASS}
{$IFEND}
フォームに優先順位クラスを表示するComboBox(StyleはcsDropDownList)と優先順位クラスを取得、設定するButtonを配置し、フォームのOnCreateイベントでComboBoxに優先順位クラスの表示文字列と値を格納します。
procedure TForm1.FormCreate(Sender: TObject);
begin
with ComboBox1.Items do
begin
BeginUpdate;
try
Clear;
AddObject(Format('%s (0x%8.8X)',['IDLE',IDLE_PRIORITY_CLASS]),
TObject(IDLE_PRIORITY_CLASS));
AddObject(Format('%s (0x%8.8X)',['BELOW_NORMAL',BELOW_NORMAL_PRIORITY_CLASS]),
TObject(BELOW_NORMAL_PRIORITY_CLASS));
AddObject(Format('%s (0x%8.8X)',['NORMAL',NORMAL_PRIORITY_CLASS]),
TObject(NORMAL_PRIORITY_CLASS));
AddObject(Format('%s (0x%8.8X)',['ABOVE_NORMAL',ABOVE_NORMAL_PRIORITY_CLASS]),
TObject(ABOVE_NORMAL_PRIORITY_CLASS));
AddObject(Format('%s (0x%8.8X)',['HIGH',HIGH_PRIORITY_CLASS]),
TObject(HIGH_PRIORITY_CLASS));
AddObject(Format('%s (0x%8.8X)',['REALTIME',REALTIME_PRIORITY_CLASS]),
TObject(REALTIME_PRIORITY_CLASS));
finally
EndUpdate;
end;
end;
end;
自プロセスの優先順位クラスを取得して表示します。
{$WARN SYMBOL_PLATFORM OFF}
procedure TForm1.Button1Click(Sender: TObject);
var
PriorityClass: DWORD;
I: Integer;
begin
PriorityClass := GetPriorityClass(GetCurrentProcess);
with ComboBox1 do
begin
for I := 0 to Items.Count - 1 do
begin
if DWORD(Items.Objects[I]) = PriorityClass then
begin
ItemIndex := I;
Exit;
end;
end;
ItemIndex := -1;
end;
end;
今度は選択された優先順位クラスを自プロセスに設定します。
procedure TForm1.Button2Click(Sender: TObject);
var
PriorityClass: DWORD;
begin
with ComboBox1 do
begin
if ItemIndex < 0 then
begin
Exit;
end;
PriorityClass := DWORD(Items.Objects[ItemIndex]);
Win32Check(SetPriorityClass(GetCurrentProcess,PriorityClass));
end;
end;
Windowsにおけるスケジューリングのメカニズムは非常に複雑で、優先順位が実行中に動的に変更されるなど、単純に優先順位クラスなどで決まるわけではありません。このあたりをきちんと理解するためにはAdvanced Windows 第5版 上 (amazon)の"7.8 スレッドの優先度"、"7.9 優先度クラスの概要"、"7.10 プログラミングの優先度"やインサイドWindows 第6版 上 (amazon) の"5.7 スレッドのスケジューリング"などを読むことをお勧めします。→GetPriorityClassとSetPriorityClassで優先順位クラスを取得/設定する (Gist)