Bagikan melalui


Multithreading: Tips Pemrograman MFC

Aplikasi multithread memerlukan perawatan yang lebih ketat daripada aplikasi utas tunggal untuk memastikan bahwa operasi terjadi dalam urutan yang dimaksudkan, dan data apa pun yang diakses oleh beberapa utas tidak rusak. Topik ini menjelaskan teknik untuk menghindari potensi masalah saat memprogram aplikasi multithreaded dengan pustaka Microsoft Foundation Class (MFC).

Mengakses Objek dari Beberapa Utas

Objek MFC tidak aman dengan sendirinya. Dua utas terpisah tidak dapat memanipulasi objek yang sama kecuali Anda menggunakan kelas sinkronisasi MFC dan/atau objek sinkronisasi Win32 yang sesuai, seperti bagian penting. Untuk informasi selengkapnya tentang bagian penting dan objek terkait lainnya, lihat Sinkronisasi di Windows SDK.

Pustaka kelas menggunakan bagian penting secara internal untuk melindungi struktur data global, seperti yang digunakan oleh alokasi memori debug.

Mengakses Objek MFC dari Utas Non-MFC

Jika Anda memiliki aplikasi multithread yang membuat utas dengan cara selain menggunakan objek CWinThread , Anda tidak dapat mengakses objek MFC lain dari utas tersebut. Dengan kata lain, jika Anda ingin mengakses objek MFC apa pun dari utas sekunder, Anda harus membuat utas tersebut dengan salah satu metode yang dijelaskan dalam Multithreading: Membuat Utas Antarmuka Pengguna atau Multithreading: Membuat Utas Pekerja. Metode ini adalah satu-satunya yang memungkinkan pustaka kelas menginisialisasi variabel internal yang diperlukan untuk menangani aplikasi multithread.

Windows Handle Maps

Sebagai aturan umum, utas hanya dapat mengakses objek MFC yang dibuatnya. Ini karena peta penanganan Windows sementara dan permanen disimpan di penyimpanan lokal utas untuk membantu menjaga perlindungan dari akses simultan dari beberapa utas. Misalnya, utas pekerja tidak dapat melakukan perhitungan lalu memanggil fungsi anggota dokumen UpdateAllViews untuk memiliki jendela yang berisi tampilan pada data baru yang dimodifikasi. Ini tidak berpengaruh sama sekali, karena peta dari CWnd objek ke HWND bersifat lokal ke utas utama. Ini berarti bahwa satu utas mungkin memiliki pemetaan dari handel Windows ke objek C++, tetapi utas lain mungkin memetakan handel yang sama ke objek C++ yang berbeda. Perubahan yang dilakukan dalam satu utas tidak akan tercermin di utas lainnya.

Ada beberapa cara untuk mengatasi masalah ini. Yang pertama adalah meneruskan handel individu (seperti HWND) daripada objek C++ ke utas pekerja. Utas pekerja kemudian menambahkan objek ini ke peta sementara dengan memanggil fungsi anggota yang sesuai FromHandle . Anda juga dapat menambahkan objek ke peta permanen utas dengan memanggil Attach, tetapi ini harus dilakukan hanya jika Anda dijamin bahwa objek akan ada lebih lama dari utas.

Metode lain adalah membuat pesan baru yang ditentukan pengguna yang sesuai dengan berbagai tugas yang akan dilakukan utas pekerja Anda dan memposting pesan ini ke jendela utama aplikasi menggunakan ::PostMessage. Metode komunikasi ini mirip dengan dua aplikasi berbeda yang berkonversi kecuali bahwa kedua utas dijalankan di ruang alamat yang sama.

Untuk informasi selengkapnya tentang menangani peta, lihat Catatan Teknis 3. Untuk informasi selengkapnya tentang penyimpanan lokal utas, lihat Penyimpanan Lokal Utas dan Menggunakan Penyimpanan Lokal Utas di Windows SDK.

Berkomunikasi Antar Utas

MFC menyediakan sejumlah kelas yang memungkinkan utas menyinkronkan akses ke objek untuk menjaga keamanan utas. Penggunaan kelas-kelas ini dijelaskan dalam Multithreading: Cara Menggunakan Kelas Sinkronisasi dan Multithreading: Kapan Menggunakan Kelas Sinkronisasi. Untuk informasi selengkapnya tentang objek ini, lihat Sinkronisasi di Windows SDK.

Lihat juga

Multithreading dengan C++ dan MFC