Bagikan melalui


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
Wxutil.h (termasuk Streams.h)
Pustaka
Strmbase.lib (build ritel);
Strmbasd.lib (build debug)