Maison >développement back-end >C++ >Comment puis-je effectuer en toute sécurité des opérations de blocage sur les threads STA à l'aide de StaTaskScheduler ?

Comment puis-je effectuer en toute sécurité des opérations de blocage sur les threads STA à l'aide de StaTaskScheduler ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-11 10:47:42658parcourir

How Can I Safely Perform Blocking Operations on STA Threads Using StaTaskScheduler?

StaTaskScheduler et pompage de messages

StaTaskScheduler fait partie de la bibliothèque ParallelExtensionsExtras et permet aux utilisateurs de planifier des tâches sur des threads cloisonnés à thread unique (STA). Par défaut, les threads STA ne pompent pas les messages, ce qui peut provoquer des blocages lors de l'exécution d'opérations de blocage.

Pour éviter les blocages, vous pouvez implémenter un contexte de synchronisation personnalisé pour pomper explicitement les messages. Cela implique de remplacer la méthode Wait de la classe SynchronizationContext pour inclure le pompage de messages.

Mise en œuvre du pompage de messages

Implémenter le pompage de messages dans la méthode Wait :

  1. Utilisez MsgWaitForMultipleObjectsEx au lieu de CoWaitForMultipleHandles pour vérifier les messages en attente.
  2. Si un message est détecté, pompez manuellement le message à l'aide de PeekMessage(PM_REMOVE) et DispatchMessage.
  3. Continuez à attendre le handle dans la méthode Wait pour vous assurer que la pompe à messages continue de fonctionner.

Exemple de mise en œuvre

Voici un exemple d'implémentation d'une simple boucle de pompage de messages :

<code class="language-c#">var msg = new NativeMethods.MSG();

while (true) {
    nativeResult = NativeMethods.MsgWaitForMultipleObjectsEx(
        count, waitHandles,
        (uint)remainingTimeout,
        QS_MASK,
        NativeMethods.MWMO_INPUTAVAILABLE);

    if (IsNativeWaitSuccessful(count, nativeResult, out managedResult) || WaitHandle.WaitTimeout == managedResult)
        return managedResult;

    if (NativeMethods.PeekMessage(out msg, IntPtr.Zero, 0, 0, NativeMethods.PM_REMOVE)) {
        NativeMethods.TranslateMessage(ref msg);
        NativeMethods.DispatchMessage(ref msg);
    }
    if (hasTimedOut())
        return WaitHandle.WaitTimeout;
}</code>

En implémentant un contexte de synchronisation personnalisé avec des capacités de pompage de messages, les opérations de blocage peuvent être effectuées en toute sécurité sur le thread STA, évitant ainsi les blocages.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn