İş Kuyruklarını Kullanma

Bu konuda, Microsoft Media Foundation'da iş kuyruklarının nasıl kullanılacağı açıklanmaktadır.

İş Kuyruklarını Kullanma

İş kuyruğu, başka bir iş parçacığında zaman uyumsuz işlemler gerçekleştirmenin verimli bir yoludur. Kavramsal olarak, iş öğelerini kuyruğa koyarsınız ve kuyruğun kuyruktaki her öğeyi çeken ve dağıtan bir iş parçacığı vardır. İş öğeleri, IMFAsyncCallback arabirimi kullanılarak geri çağırma işlevi olarak uygulanır.

Media Foundation, platform iş kuyrukları olarak adlandırılan birkaç standart iş kuyruğu oluşturur. Uygulamalar, özel iş kuyruklarıolarak adlandırılan kendi iş kuyruklarını da oluşturabilir. Platform çalışma kuyruklarının listesi için bkz. İş Kuyruğu Tanımlayıcıları. Özel bir iş kuyruğu oluşturmak için MFAllocateWorkQueueçağrısında bulunur. Bu işlev yeni iş kuyruğu için bir tanımlayıcı döndürür. Bir öğeyi kuyruğa almak için MFPutWorkItem veya MFPutWorkItemExçağırın. Her iki durumda da bir geri çağırma arabirimi belirtmeniz gerekir.

  • MFPutWorkItem, IMFAsyncCallback arabirimine bir işaretçi alır ve isteğe bağlı olarak IUnknown 'yi uygulayan bir durum nesnesi de alabilir. Bunlar, Zaman Uyumsuz Geri Çağırma Yöntemlerikonusunda açıklandığı gibi zaman uyumsuz yöntemlerde kullanılan parametrelerle aynıdır. Dahili olarak, bu işlev geri çağırmanın Invoke yöntemine geçirilen zaman uyumsuz bir sonuç nesnesi oluşturur.
  • MFPutWorkItemEx, IMFAsyncResult arabiriminin bir işaretçisini alır. Bu arabirim zaman uyumsuz bir sonuç nesnesini temsil eder. MFCreateAsyncResult çağırarak ve geri çağırma arabiriminizi ve isteğe bağlı olarak bir durum nesnesi belirterek bu nesneyi oluşturun.

Her iki durumda da iş kuyruğu iş parçacığı IMFAsyncCallback::Invoke yönteminizi çağırır. İş öğesini gerçekleştirmek için Invoke yöntemini kullanın.

Birden fazla iş parçacığı veya bileşen aynı iş kuyruğuna sahipse, iş kuyruğunun kilitlenmesi için MFLockWorkQueue çağırarak platformun kuyruğu serbest bırakmasını engelleyebilirsiniz. Her bir MFAllocateWorkQueue veya MFLockWorkQueueçağrısı için, iş kuyruğunu serbest bırakmak üzere MFUnlockWorkQueue bir kez çağırmanız gerekir. Örneğin, yeni bir iş kuyruğu oluşturup bunu bir kez kilitlerseniz, MFUnlockWorkQueue iki kez, MFAllocateWorkQueue çağrısı için ve bir kez MFLockWorkQueue çağrısı için çağırmalısınız.

Aşağıdaki kodda yeni bir iş kuyruğu oluşturma, kuyruğa iş öğesi yerleştirme ve iş kuyruğunun serbest bırakılması gösterilmektedir.

Windows 8'deki iş kuyrukları hakkında daha fazla bilgi için İş Kuyruğu ve İş Parçacığı Geliştirmeleri'e bakınız.

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);
}

Bu örnekte, pCallback uygulamasının IMFAsyncCallback arabirimine yönelik bir işaretçi olduğu varsayılır. Ayrıca geri çağırmanın hEvent olay tanıtıcısını ayarladığını varsayar. Kod, MFUnlockWorkQueueçağırmadan önce bu olayın ayarlanmasını bekler.

İş kuyruğu iş parçacıkları her zaman çağıranın işleminde oluşturulur. Her iş kuyruğunda geri çağırmalar seri hale getirilir. MFPutWorkItemaynı iş kuyruğuyla iki kez çağırırsanız, ilk geri çağırma döndürülene kadar ikinci geri çağırma çağrılmıyor.

İş Kuyruklarını Kapatma

MFShutdownçağırmadan önce, iş kuyruğu iş parçacıkları tarafından kullanılan tüm kaynakları serbest bırakın. Bu işlemi eşitlemek için, MFShutdown işlevinin herhangi bir iş kuyruğu dizisini kapatmasını engelleyen Media Foundation platformunu kilitleyebilirsiniz. Platform kilitliyken MFShutdown çağrılırsa, MFShutdown platformun kilidinin açılması için birkaç yüz milisaniye bekler. Bu süre içinde kilit açılmazsa, MFShutdown iş kuyruğu iş parçacıklarını kapatır.

varsayılan IMFAsyncResult uygulaması, sonuç nesnesi oluşturulduğunda Media Foundation platformunu otomatik olarak kilitler. Arayüzün serbest bırakılması platformun kilidini açar. Bu nedenle, platformu doğrudan kilitlemeniz neredeyse hiç gerekmeyecektir. Ancak, IMFAsyncResultkendi özel uygulamanızı yazarsanız, platformu el ile kilitlemeli ve kilidini açmalısınız. Platformu kilitlemek için MFLockPlatformçağrısı yapın. Platformun kilidini açmak için MFUnlockPlatformçağrısı yapın. Örnek için bkz. Özel Zaman Uyumsuz Sonuç Nesneleri.

MFShutdownçağrısı yaptıktan sonra, 5 saniyelik zaman aşımı süresi içinde platformun kilidinin açık olduğundan emin olmanız gerekir. Bunu yapmak için tüm IMFAsyncResult işaretçilerini serbest bırakın ve platformu el ile kilitlediyseniz MFUnlockPlatformçağırın. İş kuyruğundaki iş parçacıkları tarafından kullanılan kaynakları serbest bıraktığınızdan emin olun; aksi takdirde, uygulamanız bellek sızıntısına yol açabilir.

Genellikle, uygulamanız MFShutdownçağırmadan önce her Media Foundation nesnesini kapatır ve serbest bırakırsa kilitleme konusunda endişelenmeniz gerekmez. Kilitleme mekanizması, sadece MFShutdownçağrısı yaptıktan sonra iş kuyruğu iş parçacıklarının düzgün bir şekilde çıkmasını sağlar.

Zamanlanmış İş Öğelerini Kullanma

Belirli bir süre sonra geri çağırmayı zamanlamak için MFScheduleWorkItem veya MFScheduleWorkItemExçağırabilirsiniz.

  • MFScheduleWorkItemgeri çağırmanıza, isteğe bağlı durum nesnesine ve zaman aşımı aralığına yönelik bir işaretçi alır.
  • MFScheduleWorkItemEx bir eşzamansız sonuç nesnesine işaretçi ve bir zaman aşımı değeri alır.

Zaman aşımını milisaniye cinsinden negatif bir değer olarak belirtin. Örneğin, 5 saniye içinde çağrılacak bir geri çağırma zamanlamak için −5000 değerini kullanın. Her iki işlev de bir MFWORKITEM_KEY değeri döndürür. Bu değeri MFCancelWorkItem işlevine geçirerek geri çağırmayı iptal etmek için kullanabilirsiniz.

Zamanlanmış iş öğeleri her zaman MFASYNC_CALLBACK_QUEUE_TIMER platform iş kuyruğu kullanır.

Düzenli Geri Çağırmaları Kullanma

MFAddPeriodicCallback işlevi, iptal edene kadar belirli aralıklarla çağrılacak bir geri çağırma işlevini düzenler. Geri çağırma aralığı sabittir; uygulamalar bunu değiştiremez. Tam aralığı öğrenmek için MFGetTimerPeriodicityçağırın. Aralık 10 milisaniye sırasına göredir, bu nedenle bu işlev, sunu saati uygulama gibi sık sık "onay işaretine" ihtiyacınız olan durumlar için tasarlanmıştır. Bir işlemi daha az sıklıkta gerçekleşecek şekilde zamanlamak istiyorsanız, daha önce açıklandığı gibi zamanlanmış bir iş öğesi kullanın.

Bu konuda açıklanan diğer geri çağırmalardan farklı olarak, düzenli geri çağırma IMFAsyncCallback arabirimini kullanmaz. Bunun yerine bir işlev işaretçisi kullanır. Daha fazla bilgi için bkz. MFPERIODICCALLBACK Geri Çağırma.

Düzenli geri aramayı iptal etmek için MFRemovePeriodicCallbackçağırın.

Zamanlanmış geri çağırmalar, MFASYNC_CALLBACK_QUEUE_TIMER platform iş kuyruğunu kullanır.

İş Kuyruklarını

MFASYNCRESULT

İş Kuyruğu ve İş Parçacığı Geliştirmeleri