Multithreading: Mengakhiri Utas di MFC
Dua situasi normal menyebabkan utas dihentikan: fungsi pengontrol keluar atau utas tidak diizinkan untuk dijalankan hingga selesai. Jika prosesor kata menggunakan utas untuk pencetakan latar belakang, fungsi pengontrol akan berakhir secara normal jika pencetakan berhasil diselesaikan. Namun, jika pengguna ingin membatalkan pencetakan, utas pencetakan latar belakang harus dihentikan sebelum waktunya. Topik ini menjelaskan cara menerapkan setiap situasi dan cara mendapatkan kode keluar dari utas setelah berakhir.
Penghentian Utas Normal
Untuk utas pekerja, penghentian utas normal sederhana: Keluar dari fungsi pengontrol dan kembalikan nilai yang menandakan alasan penghentian. Anda dapat menggunakan fungsi AfxEndThread atau return
pernyataan. Biasanya, 0 menandakan keberhasilan penyelesaian, tetapi itu terserah Anda.
Untuk utas antarmuka pengguna, prosesnya sama sederhananya: dari dalam utas antarmuka pengguna, panggil PostQuitMessage di Windows SDK. Satu-satunya parameter yang PostQuitMessage
mengambil adalah kode keluar dari utas. Sedangkan untuk utas pekerja, 0 biasanya menandakan keberhasilan penyelesaian.
Penghentian Utas Prematur
Mengakhiri utas sebelum waktunya hampir sama sederhananya: Panggil AfxEndThread dari dalam utas. Berikan kode keluar yang diinginkan sebagai satu-satunya parameter. Ini menghentikan eksekusi utas, membatalkan alokasi tumpukan utas, melepaskan semua DLL yang terpasang pada utas, dan menghapus objek utas dari memori.
AfxEndThread
harus dipanggil dari dalam utas untuk dihentikan. Jika Anda ingin mengakhiri utas dari utas lain, Anda harus menyiapkan metode komunikasi antara dua utas.
Mengambil Kode Keluar dari Utas
Untuk mendapatkan kode keluar dari pekerja atau utas antarmuka pengguna, panggil fungsi GetExitCodeThread . Untuk informasi tentang fungsi ini, lihat Windows SDK. Fungsi ini membawa handel ke utas (disimpan dalam m_hThread
anggota CWinThread
data objek) dan alamat DWORD.
Jika utas masih aktif, GetExitCodeThread
tempatkan STILL_ACTIVE di alamat DWORD yang disediakan; jika tidak, kode keluar ditempatkan di alamat ini.
Mengambil kode keluar objek CWinThread mengambil langkah tambahan. Secara default, saat CWinThread
utas berakhir, objek utas dihapus. Ini berarti Anda tidak dapat mengakses m_hThread
anggota data karena CWinThread
objek tidak lagi ada. Untuk menghindari situasi ini, lakukan salah satu hal berikut:
Atur
m_bAutoDelete
anggota data ke FALSE. Ini memungkinkanCWinThread
objek untuk bertahan hidup setelah utas dihentikan. Anda kemudian dapat mengaksesm_hThread
anggota data setelah utas dihentikan. Namun, jika Anda menggunakan teknik ini, Anda bertanggung jawab untuk menghancurkanCWinThread
objek karena kerangka kerja tidak akan secara otomatis menghapusnya untuk Anda. Ini adalah metode yang disukai.Simpan handel utas secara terpisah. Setelah utas dibuat, salin anggota datanya
m_hThread
(menggunakan::DuplicateHandle
) ke variabel lain dan akses melalui variabel tersebut. Dengan cara ini objek dihapus secara otomatis ketika penghentian terjadi dan Anda masih dapat mengetahui mengapa utas dihentikan. Berhati-hatilah agar utas tidak berakhir sebelum Anda dapat menduplikasi handel. Cara paling aman untuk melakukan ini adalah dengan meneruskan CREATE_SUSPENDED ke AfxBeginThread, menyimpan handel, lalu melanjutkan utas dengan memanggil ResumeThread.
Salah satu metode memungkinkan Anda menentukan mengapa CWinThread
objek dihentikan.
Lihat juga
Multithreading dengan C++ dan MFC
_endthread, _endthreadex
_beginthread, _beginthreadex
ExitThread