Mengelola Referensi Utas

Artikel ini berisi informasi tentang pengelolaan referensi utas menggunakan fungsi dari fungsi utilitas ringan Shell.

Situasi muncul ketika utas induk harus tetap aktif selama masa pakai utas anak. Misalnya, jika objek Model Objek Komponen (COM) dibuat pada utas induk dan dinaungi ke utas anak, utas induk tersebut tidak dapat dihentikan sebelum utas anak. Untuk mencapai hal ini, Shell menyediakan fungsi-fungsi ini.

Gunakan fungsi-fungsi ini di utas induk Anda seperti yang diuraikan di sini.

  1. Nyatakan prosedur utas yang ditentukan aplikasi dengan mengikuti bentuk fungsi ThreadProc .

    DWORD WINAPI ThreadProc(LPVOID lpParameter);
    
  2. Di ThreadProc Anda, panggil SHCreateThreadRef untuk membuat referensi ke utas. Ini menyediakan penunjuk ke instans IUnknown. IUnknown ini menggunakan nilai yang ditujukkan oleh pcRef untuk mempertahankan jumlah referensi. Selama jumlah ini lebih besar dari 0, utas tetap aktif.

  3. Dengan menggunakan pointer tersebut ke IUnknown, panggil SHSetThreadRef di ThreadProc Anda. Ini mengatur referensi sehingga panggilan berikutnya ke SHGetThreadRef memiliki sesuatu untuk diambil.

  4. Jika ThreadProc Anda membuat utas lain, ThreadProc utas tersebut dapat memanggil SHGetThreadRef dengan pointer ke IUnknown yang diperoleh oleh SHCreateThreadRef. Ini meningkatkan jumlah referensi yang ditunjukkan oleh parameter pcRef di SHCreateThreadRef.

  5. Buat utas. Ini biasanya dilakukan dengan memanggil SHCreateThread, meneruskan pointer ke ThreadProc Anda di parameter pfnThreadProc . Berikan juga bendera CTF_THREAD_REF di parameter dwFlags . Utas aktif selama ThreadProc dijalankan.

  6. Saat utas anak dibuat, berikan bendera CTF_REF_COUNTED di parameter dwFlags dalam panggilan ke SHCreateThread-nya.

  7. Saat utas anak selesai dan dirilis, nilai yang ditunjukkan oleh pcRef utas induk berkurang. Setelah semua utas anak selesai, ThreadProc asli dapat menyelesaikan dan merilis referensi utas akhir, menghilangkan jumlah referensi menjadi 0. Pada saat itu, referensi ke utas asli yang dibuka oleh SHCreateThread dirilis dan utas selesai.

Fungsi terkait lainnya adalah SHReleaseThreadRef. Fungsi ini dipanggil oleh ThreadProc jika utas telah dibuat menggunakan SHCreateThread dengan bendera CTF_THREAD_REF . Namun, ThreadProc tidak diperlukan untuk melakukannya secara implisit. Memanggil IUnknown::Release pada pointer ke IUnknown yang diperoleh melalui SHCreateThreadRef adalah semua yang perlu dilakukan.