MsgWaitForMultipleObjectsEx, fonction (winuser.h)
Attend que l’un ou l’ensemble des objets spécifiés soient dans l’état signalé, qu’une routine d’achèvement d’E/S ou un appel de procédure asynchrone (APC) soit mis en file d’attente vers le thread, soit que l’intervalle de délai d’attente s’écoule. Le tableau d’objets peut inclure des objets d’événement d’entrée, que vous spécifiez à l’aide du paramètre dwWakeMask.
Syntaxe
DWORD MsgWaitForMultipleObjectsEx(
[in] DWORD nCount,
[in] const HANDLE *pHandles,
[in] DWORD dwMilliseconds,
[in] DWORD dwWakeMask,
[in] DWORD dwFlags
);
Paramètres
[in] nCount
Nombre de handles d’objet dans le tableau pointé par pHandles. Le nombre maximal de handles d’objet est MAXIMUM_WAIT_OBJECTS moins un. Si ce paramètre a la valeur zéro, la fonction attend uniquement un événement d’entrée.
[in] pHandles
Tableau de handles d’objet. Pour obtenir la liste des types d’objets dont vous pouvez spécifier les handles, consultez la section Remarques plus loin dans cette rubrique. Le tableau peut contenir des handles vers plusieurs types d’objets. Il peut ne pas contenir plusieurs copies du même handle.
Si l’un de ces handles est fermé pendant que l’attente est toujours en attente, le comportement de la fonction n’est pas défini.
Les handles doivent disposer du droit d’accès SYNCHRONIZE. Pour plus d’informations, consultez Standard Access Rights.
[in] dwMilliseconds
Intervalle de délai d’attente, en millisecondes. Si une valeur différente de zéro est spécifiée, la fonction attend que les objets spécifiés soient signalés, qu’une routine d’achèvement d’E/S ou d’APC soit mise en file d’attente ou que l’intervalle s’écoule. Si dwMilliseconds est égal à zéro, la fonction n’entre pas dans un état d’attente si les critères ne sont pas remplis ; elle retourne toujours immédiatement. Si dwMilliseconds est infinite, la fonction retourne uniquement lorsque les objets spécifiés sont signalés ou qu’une routine d’achèvement d’E/S ou d’APC est mise en file d’attente.
Windows XP, Windows Server 2003, Windows Vista, Windows 7, Windows Server 2008 et Windows Server 2008 R2 : La valeur dwMilliseconds inclut le temps passé dans les états à faible alimentation. Par exemple, le délai d’attente ne cesse de compter pendant que l’ordinateur est endormi.
Windows 8, Windows Server 2012, Windows 8.1, Windows Server 2012 R2, Windows 10 et Windows Server 2016 : La valeur dwMilliseconds n’inclut pas le temps passé dans les états à faible alimentation. Par exemple, le délai d’expiration ne continue pas à compter pendant que l’ordinateur est endormi.
[in] dwWakeMask
Types d’entrée pour lesquels un handle d’objet d’événement d’entrée sera ajouté au tableau de handles d’objet. Ce paramètre peut être n’importe quelle combinaison des valeurs répertoriées dans GetQueueStatusindicateurs paramètre.
[in] dwFlags
Type d’attente. Ce paramètre peut être une ou plusieurs des valeurs suivantes.
Valeur | Signification |
---|---|
|
La fonction retourne quand l’un des objets est signalé. La valeur de retour indique l’objet dont l’état a provoqué le retour de la fonction. |
|
La fonction retourne également si un APC a été mis en file d’attente vers le thread avec QueueUserAPC pendant que le thread est dans l’état d’attente. |
|
La fonction retourne si l’entrée existe pour la file d’attente, même si l’entrée a été vue (mais pas supprimée) à l’aide d’un appel à une autre fonction, telle que PeekMessage. |
|
La fonction retourne lorsque tous les objets de la pHandles tableau sont signalés et qu’un événement d’entrée a été reçu en même temps. |
Valeur de retour
Si la fonction réussit, la valeur de retour indique l’événement qui a provoqué le retour de la fonction. Il peut s’agir de l’une des valeurs suivantes. (Notez que WAIT_OBJECT_0 est défini comme 0 et WAIT_ABANDONED_0 est défini comme 0x00000080L.)
Retourner le code/la valeur | Description |
---|---|
|
Si l’indicateur MWMO_WAITALL est utilisé, une valeur de retour dans la plage spécifiée indique que l’état de tous les objets spécifiés est signalé. Sinon, la valeur de retour moins WAIT_OBJECT_0 indique le pHandles'index de tableau de l’objet qui a provoqué le retour de la fonction. |
|
Une nouvelle entrée du type spécifié dans le paramètre dwWakeMask est disponible dans la file d’attente d’entrée du thread. Fonctions telles que PeekMessage, GetMessage, GetQueueStatuset WaitMessage marquer les messages dans la file d’attente en tant qu’anciens messages. Par conséquent, après avoir appelé l’une de ces fonctions, un appel ultérieur à MsgWaitForMultipleObjectsEx ne retournera pas tant que la nouvelle entrée du type spécifié n’arrive pas.
Cette valeur est également retournée lors de l’occurrence d’un événement système qui nécessite l’action du thread, telle que l’activation au premier plan. Par conséquent, MsgWaitForMultipleObjectsEx peut retourner même si aucune entrée appropriée n’est disponible et même si dwWakeMask a la valeur 0. Si cela se produit, appelez GetMessage ou PeekMessage pour traiter l’événement système avant d’essayer l’appel à MsgWaitForMultipleObjectsEx. |
|
Si l’indicateur MWMO_WAITALL est utilisé, une valeur de retour dans la plage spécifiée indique que l’état de tous les objets spécifiés est signalé et qu’au moins un des objets est un objet mutex abandonné. Sinon, la valeur de retour moins WAIT_ABANDONED_0 indique l’index de tableau pHandles d’un objet mutex abandonné qui a provoqué le retour de la fonction. La propriété de l’objet mutex est accordée au thread appelant et le mutex est défini sur non signé.
Si le mutex protège les informations d’état persistant, vous devez vérifier la cohérence. |
|
L’attente a été terminée par un ou plusieurs appels de procédure asynchrone en mode utilisateur (APC) mis en file d’attente vers le thread. |
|
L’intervalle de délai d’attente s’est écoulé, mais les conditions spécifiées par le dwFlags et paramètres de dwWakeMask n’ont pas été remplies. |
|
La fonction a échoué. Pour obtenir des informations d’erreur étendues, appelez GetLastError. |
Remarques
La fonction MsgWaitForMultipleObjectsEx détermine si les conditions spécifiées par dwWakeMask et dwFlags ont été remplies. Si les conditions n’ont pas été remplies, le thread appelant entre dans l’état d’attente jusqu’à ce que les conditions des critères d’attente aient été remplies ou que l’intervalle de délai d’attente s’écoule.
Lorsque dwFlags est égal à zéro, cette fonction vérifie les handles du tableau dans l’ordre commençant par l’index 0, jusqu’à ce qu’un des objets soit signalé. Si plusieurs objets deviennent signalés, la fonction retourne l’index du premier handle dans le tableau dont l’objet a été signalé.
MsgWaitForMultipleObjectsEx ne retourne pas s’il existe une entrée non lue du type spécifié dans la file d’attente de messages une fois que le thread a appelé une fonction pour vérifier la file d’attente, sauf si vous utilisez l’indicateur MWMO_INPUTAVAILABLE. Cela est dû au fait que les fonctions telles que PeekMessage, GetMessage, GetQueueStatuset WaitMessage vérifier la file d’attente, puis modifier les informations d’état de la file d’attente afin que l’entrée ne soit plus considérée comme nouvelle. Un appel ultérieur à MsgWaitForMultipleObjectsEx ne retourne pas tant que la nouvelle entrée du type spécifié n’arrive pas, sauf si vous utilisez l’indicateur MWMO_INPUTAVAILABLE. Si cet indicateur n’est pas utilisé, l’entrée non lus existante (reçue avant la dernière vérification de la file d’attente) est ignorée.
La fonction modifie l’état de certains types d’objets de synchronisation. La modification se produit uniquement pour l’objet ou les objets dont l’état signalé a provoqué le retour de la fonction. Par exemple, le système diminue le nombre d’un objet sémaphore par un. Pour plus d’informations, consultez la documentation relative aux objets de synchronisation individuels.
La fonction MsgWaitForMultipleObjectsEx peut spécifier des handles de l’un des types d’objets suivants dans le tableau pHandles :
- Notification de modification
- Entrée de console
- Événement
- Notification de ressource mémoire
- Mutex
- Processus
- Sémaphore
- Fil
- Minuteur pouvant être attendu
Exigences
Exigence | Valeur |
---|---|
client minimum pris en charge | Windows XP [applications de bureau uniquement] |
serveur minimum pris en charge | Windows Server 2003 [applications de bureau uniquement] |
plateforme cible | Windows |
d’en-tête | winuser.h (include Windows.h) |
bibliothèque | User32.lib |
DLL | User32.dll |