自分のプロセスの優先度を変える

require 'win32ole'
module Win32
  NORMAL_PRIORITY_CLASS       = 0x00000020
  IDLE_PRIORITY_CLASS         = 0x00000040
  HIGH_PRIORITY_CLASS         = 0x00000080
  REALTIME_PRIORITY_CLASS     = 0x00000100
  BELOW_NORMAL_PRIORITY_CLASS = 0x00004000
  ABOVE_NORMAL_PRIORITY_CLASS = 0x00008000

  def set_self_priority(priority)
    cls = WIN32OLE.connect("winmgmts:\\\\.\\root\\cimv2")
    objs = cls.ExecQuery("SELECT * FROM Win32_Process WHERE ProcessId = #{Process.pid}")
    objs.each do |o|
      o.SetPriority(priority)
    end
  end
  module_function :set_self_priority
end

Win32APIでSetPriorityClassとGetProcessHandleを利用した方が速度面では有利そうな。
もっとも、しょっちゅう変更するものでもないから動けば十分。:-)


objs.eachせずにobjs.item(1)でアクセスできそうなんだけれど…。

irb(main):021:0> objs.item(1)
WIN32OLERuntimeError: item
    OLE error code:80041001 in SWbemObjectSet
      エラーです
    HRESULT error code:0x80020009
      例外が発生しました。
        from (irb):21:in `method_missing'
        from (irb):21
        from :0