指定したスレッドの優先順位を設定          <TOP>


GetPriorityClass 指定のプロセスのプライオリティクラスを取得

SetPriorityClass 指定のプロセスのプライオリティクラスを設定

GetThreadPriority 指定したスレッドの優先順位を取得

SetThreadPriority 指定したスレッドの優先順位を設定

GetCurrentProcess 現在のプロセスに対応する疑似ハンドルを取得

GetCurrentThread カレントスレッドの疑似ハンドルを取得

GetTickCount システムが起動してからの経過時間を取得

 

優先順位:高(1〜10000カウント中割り込みできない)

 

優先順位:低(カウント中、フォームをクリックするとボタンクリックからの経過時間が表示される)

  

スレッドの優先度の指定  基本優先度
リアルタイム             24
高                13
通常以上             10
通常                8
通常以下              6
低                 4
 

'================================================================
'= 指定したスレッドの優先順位を設定

'=    (SetPriorityClass.bas)
'================================================================
#include "Windows.bi"

' 指定のプロセスのプライオリティクラスを取得
Declare Function Api_GetPriorityClass& Lib "kernel32" Alias "GetPriorityClass" (ByVal hProcess&)

' 指定のプロセスのプライオリティクラスを設定
Declare Function Api_SetPriorityClass& Lib "kernel32" Alias "SetPriorityClass" (ByVal hProcess&, ByVal dwPriorityClass&)

' 指定したスレッドの優先順位を取得
Declare Function Api_GetThreadPriority& Lib "kernel32" Alias "GetThreadPriority" (ByVal hThread&)

' 指定したスレッドの優先順位を設定
Declare Function Api_SetThreadPriority& Lib "kernel32" Alias "SetThreadPriority" (ByVal hThread&, ByVal nPriority&)

' 現在のプロセスに対応する疑似ハンドルを取得
Declare Function Api_GetCurrentProcess& Lib "Kernel32" Alias "GetCurrentProcess" ()

' カレントスレッドの擬似ハンドルを取得
Declare Function Api_GetCurrentThread& Lib "kernel32" Alias "GetCurrentThread" ()

' システムが起動してからの経過時間を取得
Declare Function Api_GetTickCount& Lib "Kernel32" Alias "GetTickCount" ()

#define NORMAL_PRIORITY_CLASS &H20      '通常クラス(一般的なプロセス)
#define IDLE_PRIORITY_CLASS &H40        'アイドルクラス(システムがアイドル状態のときにだけスレッドを実行するプロセスであることを指定)
#define HIGH_PRIORITY_CLASS &H80        '優先クラス(すぐに実行されなければならないタスクを実行するプロセスであることを指定)
#define REALTIME_PRIORITY_CLASS &H100   'リアルタイムクラス(最優先順位クラスを持つプロセスであることを指定)
#define ABOVE_NORMAL_PRIORITY_CLASS &H8000 'NORMAL_PRIORITY_CLASS以上HIGH_PRIORITY_CLASS以下の優先度を持つ(Windows2000/XP)
#define BELOW_NORMAL_PRIORITY_CLASS &H4000 'IDLE_PRIORITY_CLASS以上NORMAL_PRIORITY_CLASS以下の優先度を持つ(Windows2000/XP)

#define THREAD_BASE_PRIORITY_IDLE -15                              'デフォルト(Idle)
#define THREAD_BASE_PRIORITY_LOWRT 15                              'デフォルト(Low)
#define THREAD_BASE_PRIORITY_MAX 2                                 'デフォルト(Max)
#define THREAD_BASE_PRIORITY_MIN -2                                'デフォルト(Min)
#define THREAD_PRIORITY_HIGHEST THREAD_BASE_PRIORITY_MAX           'スレッド標準の相対優先順位値よりも2ポイント高い相対優先順位値
#define THREAD_PRIORITY_LOWEST THREAD_BASE_PRIORITY_MIN            'スレッド標準の相対優先順位値よりも2ポイント低い相対優先順位値
#define THREAD_PRIORITY_ABOVE_NORMAL (THREAD_PRIORITY_HIGHEST - 1) 'スレッド標準の相対優先順位値よりも1ポイント高い相対優先順位値
#define THREAD_PRIORITY_BELOW_NORMAL (THREAD_PRIORITY_LOWEST + 1)  'スレッド標準の相対優先順位値よりも1ポイント低い相対優先順位値
#define THREAD_PRIORITY_NORMAL 0                                   'スレッド標準の相対優先順位値
#define THREAD_PRIORITY_IDLE THREAD_BASE_PRIORITY_IDLE             '優先順位クラスが、IDLE_PRIORITY_CLASS、NORMAL_PRIORITY_CLASS、HIGH_PRIORITY_CLASSの場合、基本優先順位レベルが1
#define THREAD_PRIORITY_TIME_CRITICAL THREAD_BASE_PRIORITY_LOWRT   '優先順位クラスが、IDLE_PRIORITY_CLASS、NORMAL_PRIORITY_CLASS、HIGH_PRIORITY_CLASSの場合、基本優先順位レベルが15

Var Shared Picture1 As Object

Picture1.Attach GetDlgItem("Picture1") : Picture1.SetFontName "MS ゴシック"

Var Shared TimeNeed As Long
Var Shared Flg As Integer

'================================================================
'=
'================================================================
Declare Sub DoCount ()
Sub DoCount()
    Var i As Integer
    Var OldClassP As Long
    Var OldThreadP As Long
    Var Ret As Long
  
    OldClassP = Api_GetPriorityClass(Api_GetCurrentProcess)
    OldThreadP = Api_GetThreadPriority(Api_GetCurrentThread)

    '現在走っているプロセスの優先順位クラスを設定
    If Flg = 0 Then
        'REALTIME_PRIORITY_CLASS(優先度レベル24)
        Ret = Api_SetPriorityClass(Api_GetCurrentProcess, REALTIME_PRIORITY_CLASS)
        Ret = Api_SetThreadPriority(Api_GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL)
    Else
        'IDLE_PRIORITY_CLASS(優先度レベル4)
        Ret = Api_SetPriorityClass(Api_GetCurrentProcess, IDLE_PRIORITY_CLASS)
        Ret = Api_SetThreadPriority(Api_GetCurrentThread, THREAD_PRIORITY_IDLE)
    End If

    TimeNeed = Api_GetTickCount
    For i = 0 To 10000
        Picture1.Cls
        Picture1.Print "Count:" & Str$(i)
        CallEvent
    Next i
    Picture1.Cls
    Picture1.Print Str$((Api_GetTickCount - TimeNeed) / 1000) & "秒"

    'プライオリティクラス、スレッドの優先順位を戻す
    Ret = Api_SetPriorityClass(Api_GetCurrentProcess, OldClassP)
    Ret = Api_SetThreadPriority(Api_GetCurrentThread, OldThreadP)
End Sub

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Flg = 0
    DoCount
End Sub

'================================================================
'=
'================================================================
Declare Sub Button2_on edecl ()
Sub Button2_on()
    Flg = 1
    DoCount
End Sub

'================================================================
'=
'================================================================
Declare Sub MainForm_Click edecl ()
Sub MainForm_Click()
    A% = MessageBox("", Str$((Api_GetTickCount - TimeNeed) / 1000) & "秒", 0, 2)
End Sub

'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
Stop
End