Menggunakan Antrean Kerja
Topik ini menjelaskan cara menggunakan antrean kerja di Microsoft Media Foundation.
- Menggunakan Antrean Kerja
- Mematikan Antrean Kerja
- Menggunakan Tugas Terjadwal
- Menggunakan Panggilan Balik Berkala
- Topik terkait
Menggunakan Antrean Kerja
Antrian kerja adalah cara yang efisien untuk melakukan operasi asinkron pada thread lain. Secara konseptual, Anda menempatkan item kerja dalam antrean, dan antrean memiliki utas yang menarik setiap item dari antrean dan mengirimkannya. Item kerja diimplementasikan sebagai panggilan balik dengan menggunakan antarmukaIMFAsyncCallback.
Media Foundation membuat beberapa antrean kerja standar, yang disebut antrean kerja platform . Aplikasi juga dapat membuat antrean kerja mereka sendiri, yang disebut antrean kerja privat. Untuk daftar antrean kerja platform, lihat Pengidentifikasi Antrean Kerja . Untuk membuat antrean kerja privat, panggil MFAllocateWorkQueue. Fungsi ini mengembalikan pengidentifikasi untuk antrean kerja baru. Untuk meletakkan item dalam antrean, panggil MFPutWorkItem atau MFPutWorkItemEx. Dalam kedua kasus, Anda harus menentukan antarmuka panggilan balik.
- MFPutWorkItem mengambil penunjuk ke antarmuka IMFAsyncCallback, serta objek status opsional yang mengimplementasikan IUnknown. Ini adalah parameter yang sama yang digunakan dalam metode asinkron, seperti yang dijelaskan dalam topik Metode Panggilan Balik Asinkron. Secara internal, fungsi ini membuat objek hasil asinkron, yang diteruskan ke metode Invoke dari panggilan balik.
- MFPutWorkItemEx membawa penunjuk ke antarmukaIMFAsyncResult. Antarmuka ini mewakili objek hasil asinkron. Buat objek ini dengan memanggil MFCreateAsyncResult dan menentukan antarmuka panggilan balik Anda dan, secara opsional, objek status.
Dalam kedua kasus, thread antrian kerja memanggil metode IMFAsyncCallback::Invoke Anda. Gunakan metode Panggil untuk melakukan item kerja.
Jika lebih dari satu utas atau komponen berbagi antrean kerja yang sama, Anda dapat memanggil MFLockWorkQueue untuk mengunci antrean kerja, yang mencegah platform melepaskannya. Setiap kali Anda memanggil MFAllocateWorkQueue atau MFLockWorkQueue, Anda harus memanggil MFUnlockWorkQueue sekali untuk membebaskan antrean kerja. Misalnya, jika Anda membuat antrean kerja baru lalu menguncinya sekali, Anda harus memanggil MFUnlockWorkQueue dua kali, sekali untuk panggilan ke MFAllocateWorkQueue dan sekali untuk panggilan ke MFLockWorkQueue.
Kode berikut menunjukkan cara membuat antrean kerja baru, meletakkan item kerja dalam antrean, dan merilis antrean kerja.
Lihat Antrean Kerja dan Peningkatan Utas untuk informasi lebih lanjut tentang antrean kerja di 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);
}
Contoh ini mengasumsikan bahwa pCallback adalah penunjuk ke antarmuka IMFAsyncCallback aplikasi. Ini juga mengasumsikan bahwa panggilan balik mengatur handel peristiwa hEvent. Kode menunggu hingga peristiwa ini ditetapkan sebelum memanggil MFUnlockWorkQueue.
Alur antrean kerja selalu dibuat dalam proses pemanggil. Dalam setiap antrean kerja, panggilan balik diserialisasikan. Jika Anda memanggil MFPutWorkItem dua kali dengan antrean kerja yang sama, panggilan balik kedua tidak dipanggil hingga panggilan balik pertama kembali.
Mematikan Antrean Kerja
Sebelum memanggil MFShutdown, lepaskan setiap sumber daya yang sedang digunakan oleh utas-utas antrean kerja. Untuk menyinkronkan proses ini, Anda dapat mengunci platform Media Foundation, yang mencegah fungsi MFShutdown menutup utas antrean kerja apa pun. Jika MFShutdown dipanggil ketika platform sedang terkunci, MFShutdown menunggu beberapa ratus milidetik hingga platform terbuka. Jika tidak dibuka kuncinya dalam waktu tersebut, MFShutdown menutup utas antrean kerja.
Implementasi default IMFAsyncResult secara otomatis mengunci platform Media Foundation saat objek hasil dibuat. Melepaskan antarmuka akan membuka kunci platform. Oleh karena itu, Anda hampir tidak perlu mengunci platform secara langsung. Tetapi jika Anda menulis implementasi kustom Anda sendiri IMFAsyncResult, maka Anda harus mengunci dan membuka kunci platform secara manual. Untuk mengunci platform, panggil MFLockPlatform. Untuk membuka kunci platform, panggil MFUnlockPlatform. Misalnya, lihat Objek Hasil Asinkron Kustom.
Setelah Anda memanggil MFShutdown, Anda perlu memastikan bahwa platform terbuka dalam batas waktu habis 5 detik. Lakukan ini dengan merilis semua pointer IMFAsyncResult , dan dengan memanggil MFUnlockPlatform jika Anda mengunci platform secara manual. Pastikan untuk melepaskan semua sumber daya yang digunakan oleh thread antrean kerja, atau aplikasi Anda mungkin mengalami kebocoran memori.
Biasanya, jika Anda menutup aplikasi dan merilis semua objek Media Foundation sebelum memanggil MFShutdown, Anda tidak perlu khawatir mengenai penguncian. Mekanisme penguncian hanya memungkinkan utas antrean kerja keluar secara lancar setelah memanggil MFShutdown.
Menggunakan Item Kerja Terjadwal
Anda dapat menjadwalkan panggilan balik terjadi setelah periode waktu yang ditetapkan dengan memanggil MFScheduleWorkItem atau MFScheduleWorkItemEx.
- MFScheduleWorkItem mengambil referensi panggilan balik Anda, objek status opsional, dan interval batas waktu.
- MFScheduleWorkItemEx mengambil pointer ke objek hasil asinkron dan nilai batas waktu.
Tentukan batas waktu sebagai nilai negatif dalam milidetik. Misalnya, untuk menjadwalkan panggilan balik yang akan dipanggil dalam 5 detik, gunakan nilai −5000. Kedua fungsi mengembalikan nilai MFWORKITEM_KEY, yang dapat Anda gunakan untuk membatalkan panggilan balik dengan meneruskannya ke fungsiMFCancelWorkItem.
Item kerja terjadwal selalu menggunakan antrian tugas sistem MFASYNC_CALLBACK_QUEUE_TIMER.
Menggunakan Panggilan Balik Berkala
Fungsi MFAddPeriodicCallback menjadwalkan panggilan balik untuk dipanggil secara berkala sampai Anda membatalkannya. Interval panggilan balik diperbaiki; aplikasi tidak dapat mengubahnya. Untuk mengetahui interval yang tepat, panggil MFGetTimerPeriodicity. Intervalnya sekitar 10 milidetik, jadi fungsi ini dimaksudkan untuk situasi di mana Anda sering membutuhkan "detikan", seperti menggunakan penghitung waktu presentasi. Jika Anda ingin menjadwalkan operasi agar lebih jarang terjadi, gunakan item kerja terjadwal, seperti yang dijelaskan sebelumnya.
Tidak seperti panggilan balik lain yang dijelaskan dalam topik ini, panggilan balik berkala tidak menggunakan antarmuka IMFAsyncCallback. Sebaliknya, ia menggunakan penunjuk fungsi. Untuk informasi selengkapnya, lihat MFPERIODICCALLBACK Callback.
Untuk membatalkan panggilan balik berkala, panggil MFRemovePeriodicCallback.
Panggilan balik berkala menggunakan antrian kerja platform MFASYNC_CALLBACK_QUEUE_TIMER.
Topik terkait