Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
In dit onderwerp wordt beschreven hoe u werkwachtrijen gebruikt in Microsoft Media Foundation.
- Werkwachtrijen Gebruiken
- werkwachtrijen afsluiten
- Geplande Werkitems Gebruiken
- Periodieke callbacks gebruiken
- Verwante onderwerpen
Werkwachtrijen gebruiken
Een werkwachtrij is een efficiënte manier om asynchrone bewerkingen uit te voeren op een andere thread. Conceptueel gezien plaatst u werkitems in de wachtrij en heeft de wachtrij een thread waarmee elk item uit de wachtrij wordt opgehaald en verzonden. Werkitems worden geïmplementeerd als callbacks met behulp van de interface IMFAsyncCallback.
Media Foundation maakt verschillende standaardwerkwachtrijen, platformwerkwachtrijengenoemd. Toepassingen kunnen ook hun eigen werkwachtrijen maken, privéwerkwachtrijengenoemd. Raadpleeg Werkwachtrij-ID'svoor een lijst van de platformwerkwachtrijen. Als u een privéwerkwachtrij wilt maken, roept u MFAllocateWorkQueueaan. Deze functie retourneert een id voor de nieuwe werkwachtrij. Als u een item in de wachtrij wilt plaatsen, roept u MFPutWorkItem of MFPutWorkItemExaan. In beide gevallen moet u een callback-interface opgeven.
- MFPutWorkItem- verwijst naar de interface IMFAsyncCallback, plus een optioneel statusobject dat IUnknown-implementeert. Dit zijn dezelfde parameters die worden gebruikt in asynchrone methoden, zoals beschreven in het onderwerp Asynchrone callbackmethoden. Intern maakt de functie een asynchroon resultaatobject aan, dat wordt doorgegeven aan de Invoke-methode van de callback.
- MFPutWorkItemEx- verwijst naar de interface IMFAsyncResult. Deze interface vertegenwoordigt een asynchroon resultaatobject. Maak dit object door MFCreateAsyncResult- aan te roepen en de callback-interface en optioneel een statusobject op te geven.
In beide gevallen roept de thread van de werkwachtrij uw IMFAsyncCallback::Invoke methode aan. Gebruik de methode Aanroepen om het werkitem uit te voeren.
Als meerdere threads of onderdelen dezelfde werkwachtrij delen, kunt u MFLockWorkQueue- aanroepen om de werkwachtrij te vergrendelen, waardoor het platform het niet kan vrijgeven. Voor elke aanroep naar MFAllocateWorkQueue of MFLockWorkQueuemoet u MFUnlockWorkQueue één keer aanroepen om de werkwachtrij vrij te geven. Als u bijvoorbeeld een nieuwe werkwachtrij maakt en deze vervolgens eenmaal vergrendelt, moet u MFUnlockWorkQueue twee keer aanroepen, één keer voordat de oproep naar MFAllocateWorkQueue- en één keer voor de aanroep naar MFLockWorkQueue-.
De volgende code laat zien hoe u een nieuwe werkwachtrij maakt, een werkitem in de wachtrij plaatst en de werkwachtrij vrijgeeft.
Zie Verbeteringen in werkwachtrijen en threading voor meer informatie over werkwachtrijen in Windows 8.
DWORD idWorkQueue = 0;
HRESULT hr = S_OK;
// Create a new work queue.
hr = MFAllocateWorkQueue(&idWorkQueue);
// Put an item on the queue.
if (SUCCEEDED(hr))
{
hr = MFPutWorkItem(idWorkQueue, pCallback, NULL);
}
// Wait for the callback to be invoked.
if (SUCCEEDED(hr))
{
WaitForSingleObject(hEvent, INFINITE);
}
// Release the work queue.
if (SUCCEEDED(hr))
{
hr = MFUnlockWorkQueue(idWorkQueue);
}
In dit voorbeeld wordt ervan uitgegaan dat pCallback een aanwijzer is naar de IMFAsyncCallback interface van de toepassing. Er wordt ook van uitgegaan dat de callback de hEvent event handle instelt. De code wacht tot deze gebeurtenis is ingesteld voordat MFUnlockWorkQueuewordt aangeroepen.
Threads van de werkwachtrij worden altijd gemaakt in het proces van de aanroeper. Binnen elke werkwachtrij worden de callbacks geserialiseerd. Als u MFPutWorkItem twee keer met dezelfde werkwachtrij aanroept, wordt de tweede callback pas aangeroepen als de eerste callback is geretourneerd.
Werkwachtrijen afsluiten
Voordat u MFShutdown-aanroept, moet u alle resources vrijgeven die worden gebruikt door werkwachtrijthreads. Als u dit proces wilt synchroniseren, kunt u het Media Foundation-platform vergrendelen, waardoor de MFShutdown-functie werkwachtrijthreads niet kan sluiten. Als MFShutdown- wordt aangeroepen terwijl het platform is vergrendeld, MFShutdown enkele honderd milliseconden wacht totdat het platform is ontgrendeld. Als deze niet binnen die tijd is ontgrendeld, MFShutdown- de werkwachtrijthreads sluit.
De standaard implementatie van IMFAsyncResult het Media Foundation-platform automatisch vergrendelt wanneer het resultaatobject wordt gemaakt. Als u de interface vrijgeeft, wordt het platform ontgrendeld. Daarom hoeft u het platform bijna nooit rechtstreeks te vergrendelen. Maar als u uw eigen aangepaste implementatie van IMFAsyncResultschrijft, moet u het platform handmatig vergrendelen en ontgrendelen. Als u het platform wilt vergrendelen, roept u MFLockPlatformaan. Als u het platform wilt ontgrendelen, roept u MFUnlockPlatformaan. Zie Aangepaste Asynchrone resultaatobjectenvoor een voorbeeld.
Nadat u MFShutdown-hebt aangeroepen, moet u ervoor zorgen dat het platform binnen de time-outperiode van 5 seconden wordt ontgrendeld. Doe dit door alle IMFAsyncResult- aanwijzers vrij te geven en door MFUnlockPlatform aan te roepen als u het platform handmatig hebt vergrendeld. Zorg ervoor dat u resources vrijgeeft die door werkwachtrij threads worden gebruikt, anders kan uw toepassing geheugen lekken.
Als uw toepassing elk Media Foundation-object afsluit en loslaat voordat u MFShutdown-aanroept, hoeft u zich geen zorgen te maken over vergrendeling. Met het vergrendelingsmechanisme kunnen werkwachtrijthreads eenvoudig worden afgesloten nadat u MFShutdown-hebt aangeroepen.
Geplande werkitems gebruiken
U kunt een callback plannen om na een bepaalde periode plaats te vinden door MFScheduleWorkItem of MFScheduleWorkItemExaan te roepen.
- MFScheduleWorkItem neemt een pointer naar uw callback, een optioneel statusobject, en een time-outinterval.
- MFScheduleWorkItemEx neemt een aanwijzer naar een asynchroon resultaatobject en een time-outwaarde.
Geef de time-out op als een negatieve waarde in milliseconden. Als u bijvoorbeeld een callback wilt plannen die binnen 5 seconden moet worden aangeroepen, gebruikt u de waarde −5000. Beide functies retourneren een MFWORKITEM_KEY waarde, die u kunt gebruiken om de callback te annuleren door deze door te geven aan de MFCancelWorkItem functie.
Geplande werkitems maken altijd gebruik van de MFASYNC_CALLBACK_QUEUE_TIMER platformwerkwachtrij.
Periodieke callbacks gebruiken
De MFAddPeriodicCallback functie plant dat er periodiek een callback wordt aangeroepen totdat u deze annuleert. Het callback-interval is vast; toepassingen kunnen deze niet wijzigen. Als u het exacte interval wilt achterhalen, roept u MFGetTimerPeriodicityaan. Het interval ligt in de orde van 10 milliseconden, dus deze functie is bedoeld voor situaties waarin u een frequente 'tijdmarkering' nodig hebt, zoals het implementeren van een presentatieklok. Als u een bewerking minder vaak wilt plannen, gebruikt u een gepland werkitem, zoals eerder is beschreven.
In tegenstelling tot de andere callbacks die in dit onderwerp worden beschreven, gebruikt de periodieke callback niet de IMFAsyncCallback interface. In plaats daarvan wordt een functiepointer gebruikt. Voor meer informatie, zie MFPERIODICCALLBACK Callback.
Als u de periodieke callback wilt annuleren, belt u MFRemovePeriodicCallback.
Periodieke callbacks maken gebruik van de MFASYNC_CALLBACK_QUEUE_TIMER werkwachtrij van het platform.
Verwante onderwerpen
-
Verbeteringen in Werkwachtrij en Threading