Décourvir les "background io priority" de vista

Description

Décrouvrez ici une des nombreuses nouveautés apparue avec Vista, permettant de définir une priorité sur les IO de notre process ou thread courant. (utile pour les anti-virus, l'indexation, etc...)

Cette classe propose des méthodes afin de modifier la priorité IO pour process et/ou thread. 2 méthodes sont là également pour indiquer si un process/thread n'est pas déjà en priorité faible sur les IO.

Cela est vraiment simple à mettre en place, d'ou la simplicité de ce code. Microsoft à vraiment simplifier la chose merci aux équipes Windows ;)

Source / Exemple :


Imports System.Runtime.InteropServices

''' <summary>
''' Classe fournissant des méthodes permettant changer les priorités IO pour le process et thread courant.
''' </summary>
''' <remarks>Vista ou 2008 Server requit.</remarks>
Public Class IOPriority

    Const THREAD_MODE_BACKGROUND_BEGIN As Integer = &H10000
    Const THREAD_MODE_BACKGROUND_END As Integer = &H20000
    Const PROCESS_MODE_BACKGROUND_BEGIN As Integer = &H100000
    Const PROCESS_MODE_BACKGROUND_END As Integer = &H200000

    Public Const ERROR_THREAD_MODE_ALREADY_BACKGROUND As Integer = &H400
    Public Const ERROR_THREAD_MODE_NOT_BACKGROUND As Integer = &H401
    Public Const ERROR_PROCESS_MODE_ALREADY_BACKGROUND As Integer = &H402
    Public Const ERROR_PROCESS_MODE_NOT_BACKGROUND As Integer = &H403
    Public Const ERROR_FAILED_TO_ENTER_BACKGROUND_MODE As Integer = -1

    ''' <summary>
    ''' Indique si le thread courant est en priorité faible sur les IO.
    ''' </summary>
    ''' <returns><b>True</b> si priorité faible.<b>False</b> sinon.</returns>
    Public Shared Function IsThreadBackgroundMode() As Integer

        Dim iret As Integer = False

        Dim bIOBckMode As Boolean = SetThreadBackgroundMode(True)

        If (bIOBckMode) Then
            SetThreadBackgroundMode(False)
            iret = ERROR_THREAD_MODE_NOT_BACKGROUND
        Else

            If Marshal.GetLastWin32Error() = ERROR_THREAD_MODE_ALREADY_BACKGROUND Then
                iret = ERROR_THREAD_MODE_ALREADY_BACKGROUND
            Else
                iret = ERROR_FAILED_TO_ENTER_BACKGROUND_MODE
            End If

        End If

        Return iret

    End Function

    ''' <summary>
    ''' Indique si le process courant est en priorité faible sur les IO.
    ''' </summary>
    ''' <returns><b>True</b> si priorité faible.<b>False</b> sinon.</returns>
    Public Shared Function IsProcessBackgroundMode() As Integer

        Dim iret As Integer = False

        Dim bIOBckMode As Boolean = SetProcessBackgroundMode(True)

        If (bIOBckMode) Then
            SetProcessBackgroundMode(False)
            iret = ERROR_PROCESS_MODE_NOT_BACKGROUND
        Else

            If Marshal.GetLastWin32Error() = ERROR_PROCESS_MODE_ALREADY_BACKGROUND Then
                iret = ERROR_PROCESS_MODE_ALREADY_BACKGROUND
            Else
                iret = ERROR_FAILED_TO_ENTER_BACKGROUND_MODE
            End If

        End If

        Return iret

    End Function

    ''' <summary>
    ''' Définit la priorité du process courant sur les IO.
    ''' </summary>
    ''' <param name="enable"><b>True</b> pour passer le process en priorité faible sur les IO. <b>False</b> pour restaurer une priorité normal sur les IO.</param>
    ''' <returns><b>True</b> si changement réussi.<b>False</b> en cas d'échec.</returns>
    Public Shared Function SetProcessBackgroundMode(ByVal enable As Boolean) As Boolean

        If CheckOsVersion() Then

            Dim bret As Boolean = False
            Dim hProcess As IntPtr = Process.GetCurrentProcess().Handle

            If enable Then
                bret = NativeMethods.SetPriorityClass(hProcess, PROCESS_MODE_BACKGROUND_BEGIN)
            Else
                bret = NativeMethods.SetPriorityClass(hProcess, PROCESS_MODE_BACKGROUND_END)
            End If

            Return bret

        Else

            Throw New Exception("Not supported by this Windows version.")

        End If

    End Function

    ''' <summary>
    ''' Définit la priorité du thread courant sur les IO.
    ''' </summary>
    ''' <param name="enable"><b>True</b> pour passer le thread en priorité faible sur les IO. <b>False</b> pour restaurer une priorité normal sur les IO.</param>
    ''' <returns><b>True</b> si changement réussi.<b>False</b> en cas d'échec.</returns>
    Public Shared Function SetThreadBackgroundMode(ByVal enable As Boolean) As Boolean

        If CheckOsVersion() Then

            Dim bret As Boolean = False
            Dim hThread As IntPtr = IntPtr.Zero

            Try

                hThread = ThreadHelper.GetCurentThread()

                If enable Then
                    bret = NativeMethods.SetThreadPriority(hThread, THREAD_MODE_BACKGROUND_BEGIN)
                Else
                    bret = NativeMethods.SetThreadPriority(hThread, THREAD_MODE_BACKGROUND_END)
                End If

            Catch ex As Exception

            Finally
                ThreadHelper.CloseHandle(hThread)
            End Try

            Return bret

        Else

            Throw New Exception("Not supported by this Windows version.")

        End If

    End Function

    ''' <summary>
    ''' Vérifie la version de Windows (Vista ou 2008 Server).
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Shared Function CheckOsVersion() As Boolean

        If Environment.OSVersion.Version.Major >= 6 Then
            Return True
        Else
            Return False
        End If

    End Function

End Class

Conclusion :


Supporté par Vista et 2008 Server uniquement.

Commentaires, notes comme d'habitudes...:)
Merci.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.