Kelas CAMThread
[Fitur yang terkait dengan halaman ini, DirectShow, adalah fitur warisan. Ini telah digantikan oleh MediaPlayer, IMFMediaEngine, dan Pengambilan Audio/Video di Media Foundation. Fitur-fitur tersebut telah dioptimalkan untuk Windows 10 dan Windows 11. Microsoft sangat menyarankan agar kode baru menggunakan MediaPlayer, IMFMediaEngine , dan Pengambilan Audio/Video di Media Foundation alih-alih DirectShow, jika memungkinkan. Microsoft menyarankan agar kode yang ada yang menggunakan API warisan ditulis ulang untuk menggunakan API baru jika memungkinkan.]
Kelas CAMThread
ini adalah kelas abstrak untuk mengelola utas pekerja.
Variabel Anggota yang Dilindungi | Deskripsi |
---|---|
m_hThread | Tangani ke utas. |
Variabel Anggota Publik | Deskripsi |
m_AccessLock | Bagian penting yang mengunci utas agar tidak diakses oleh utas lain. |
m_WorkerLock | Bagian penting yang mengunci data yang dibagikan di antara utas. |
Metode Publik | Deskripsi |
CAMThread | Metode konstruktor. |
~ CAMThread | Metode destruktor. Virtual. |
InitialThreadProc | Memanggil metode ThreadProc saat utas dibuat. |
Buat | Membuat utas. |
CallWorker | Memberi sinyal utas dengan permintaan. |
Tutup | Menunggu utas keluar, lalu melepaskan sumber dayanya. |
ThreadExists | Kueri apakah utas ada. |
GetRequest | Menunggu permintaan berikutnya. |
CheckRequest | Memeriksa apakah ada permintaan, tanpa memblokir. |
Balas | Membalas permintaan. |
GetRequestHandle | Mengambil handel ke peristiwa yang disinyalir oleh metode CallWorker. |
GetRequestParam | Mengambil permintaan terbaru. |
CoInitializeHelper | Memanggil CoInitializeEx di awal utas. |
Metode Virtual Murni | Deskripsi |
ThreadProc | Prosedur utas. |
Keterangan
Kelas ini menyediakan metode untuk membuat utas pekerja, meneruskan permintaan ke utas, dan menunggu utas keluar. Untuk menggunakan kelas ini, lakukan hal berikut:
- Mendapatkan kelas dari
CAMThread
dan mengambil alih metode virtual murni CAMThread::ThreadProc. Metode ini adalah prosedur utas yang dipanggil di awal utas. - Di aplikasi Anda, buat instans kelas turunan Anda. Membuat objek tidak membuat utas. Untuk membuat utas, panggil metode CAMThread::Create .
- Untuk mengirim permintaan ke utas, panggil metode CAMThread::CallWorker . Metode ini mengambil parameter DWORD, yang maknanya ditentukan oleh kelas Anda. Metode memblokir hingga utas merespons (lihat di bawah).
- Dalam prosedur utas Anda, tanggapi permintaan dengan memanggil CAMThread::GetRequest atau CAMThread::CheckRequest. Metode GetRequest memblokir hingga utas lain memanggil CallWorker. Metode CheckRequest tidak memblokir, yang memungkinkan utas untuk memeriksa permintaan baru saat bekerja secara asinkron.
- Saat utas menerima permintaan, panggil CAMThread::Reply untuk membuka blokir utas panggilan. Metode Balasan mengambil parameter DWORD, yang diteruskan ke utas panggilan sebagai nilai pengembalian untuk CallWorker.
Setelah selesai dengan utas, panggil metode CAMThread::Close . Metode ini menunggu utas keluar, lalu menutup handel utas. Pesan ThreadProc Anda harus dijamin keluar, baik sendiri atau sebagai respons terhadap permintaan CallWorker. Metode destruktor juga memanggil Tutup.
Contoh berikut mengilustrasikan langkah-langkah berikut:
class MyThread : public CAMThread
{
protected:
DWORD ThreadProc(void);
};
DWORD MyThread::ThreadProc()
{
BOOL bShutDown = FALSE;
while (!bShutDown)
{
DWORD req = GetRequest();
printf("Request: %d\n", req);
bShutDown = (req == 0);
Reply(bShutDown ? S_FALSE : S_OK);
}
printf("Quitting Thread\n");
return 1;
}
void main()
{
MyThread thread;
DWORD reply;
thread.Create();
reply = thread.CallWorker(3);
reply = thread.CallWorker(0); // Thread exits.
}
Di kelas turunan, Anda juga dapat menentukan fungsi anggota yang memvalidasi parameter ke CallWorker. Contoh berikut menunjukkan cara umum untuk melakukan ini:
enum Command {CMD_INIT, CMD_RUN, CMD_STOP, CMD_EXIT};
HRESULT Init(void) { return CallWorker(CMD_INIT); }
HRESULT Run(void) { return CallWorker(CMD_RUN); }
HRESULT Stop(void) { return CallWorker(CMD_STOP); }
HRESULT Exit(void) { return CallWorker(CMD_EXIT); }
Kelas ini CAMThread
menyediakan dua bagian penting sebagai variabel anggota publik. Gunakan CAMThread::m_AccessLock
untuk mengunci utas agar tidak diakses oleh utas lain. (Misalnya, metode Buat dan CallWorker menahan kunci ini, untuk menserialisasikan operasi pada utas.) Gunakan CAMThread::m_WorkerLock untuk mengunci data yang dibagikan di antara utas.
Persyaratan
Persyaratan | Nilai |
---|---|
Header |
|
Pustaka |
|