まず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)
0 件のコメント:
コメントを投稿