UDF > WinAPIEx > Processes & Synchronization > Synchronization >


_WinAPI_CreateSemaphore

Crée ou ouvre un objet sémaphore nommé ou non

#include <WinAPIProc.au3>
_WinAPI_CreateSemaphore ( $sSemaphore, $iInitial, $iMaximum [, $tSecurity = 0] )

Paramètres

$sSemaphore Le nom du sémaphore à ouvrir. La comparaison des noms est sensible à la casse.
$iInitial Le compteur initial de l'objet Semaphore. Cette valeur doit être supérieure ou égale à zéro et inférieure ou égale à $iMaximum.
$iMaximum Le maximum du compteur de l'objet Semaphore. Cette valeur doit être supérieure à zéro.
$tSecurity [optionnel]Une structure $tagSECURITY_ATTRIBUTES qui spécifie un descripteur de sécurité pour le nouveau sémaphore.
Si ce paramètre est 0 (par défaut), le sémaphore reçoit un descripteur de sécurité par défaut.

Valeur de retour

Succès: Retourne le handle de l'objet sémaphore nouvellement créé.
Échec: Retourne 0, appelez _WinAPI_GetLastError() pour obtenir des informations supplémentaires sur l'erreur.

Remarques

Si l'objet Semaphore nommé existait avant l'appel de la fonction, la fonction retourne le handle de l'objet existant.

Tout processus peut spécifier le handle de l'objet Semaphore dans un appel à une fonction _WinAPI_WaitFor.... Les fonctions d'attente pour un seul objet retourne lorsque l'état de l'objet spécifié est signalé. Les fonctions d'attente pour de multiples objets peuvent être programmés pour retourner lorsque un ou tous les objets spécifiés sont signalés. Lorsqu'une fonction d'attente retourne, le processus en attente est libéré et peut continuer son exécution.

L'état d'un objet Semaphore est signalé lorsque son compteur est strictement supérieur à zéro, et non signalé lorsque son compteur est égal à zéro.
Le paramètre $iInitial spécifie la valeur du compteur initial. Chaque fois qu'un processus d'attente est libéré en raison de l'état signalé du sémaphore, le compteur du sémaphore est diminué de 1.
Utilisez la fonction _WinAPI_ReleaseSemaphore() pour incrémenter le compteur d'un sémaphore d'un montant déterminé.
Le compte ne peut jamais être inférieur à zéro ou supérieur à la valeur spécifiée pour le paramètre $iMaximum.

Utilisez la fonction _WinAPI_CloseHandle() pour fermer le handle. Le système ferme le handle automatiquement lorsque le processus se termine. Le sémaphore est détruit lorsque son dernier handle a été fermé.

En relation

_WinAPI_CloseHandle, _WinAPI_ReleaseSemaphore

Voir aussi

Consultez CreateSemaphore dans la librairie MSDN.

Exemple

#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>
#include <WinAPIHObj.au3>
#include <WinAPIProc.au3>

If Not @Compiled Then
    MsgBox($MB_SYSTEMMODAL, '', 'Pour exéuter ce script, vous devez premièrement le compiler, puis ensuite exécuter le fichier (.exe).')
    Exit
EndIf

Local $hSemaphore = _WinAPI_CreateSemaphore('MySemaphore', 2, 2)

_WinAPI_WaitForSingleObject($hSemaphore)
_MyGUI()
_WinAPI_ReleaseSemaphore($hSemaphore)
_WinAPI_CloseHandle($hSemaphore)

Func _MyGUI()
    GUICreate('Test ' & StringReplace(@ScriptName, '.au3', '()'))
    GUISetState(@SW_SHOW)
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
EndFunc   ;==>_MyGUI