Bagikan melalui


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 memungkinkan CWinThread objek untuk bertahan hidup setelah utas dihentikan. Anda kemudian dapat mengakses m_hThread anggota data setelah utas dihentikan. Namun, jika Anda menggunakan teknik ini, Anda bertanggung jawab untuk menghancurkan CWinThread 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