Çoklu İş Parçacığı Kullanımı: MFC'de İş Parçacıklarını Sonlandırma
İki normal durum bir iş parçacığının sonlandırılmasına neden olur: denetim işlevinden çıkılır veya iş parçacığının tamamlanmasına izin verilmez. Sözcük işlemcisi arka planda yazdırma için bir iş parçacığı kullandıysa, yazdırma başarıyla tamamlandığında denetim işlevi normal şekilde sonlandırılıyordu. Ancak kullanıcı yazdırmayı iptal etmek isterse arka plan yazdırma iş parçacığının erken sonlandırılması gerekir. Bu konu başlığında hem her durumun nasıl uygulanıp hem de iş parçacığı sonlandırıldıktan sonra çıkış kodunun nasıl alınıp alınıp alınmayacakları açıklanmaktadır.
Normal İş Parçacığı Sonlandırma
Bir çalışan iş parçacığı için normal iş parçacığı sonlandırma basittir: Denetim işlevinden çıkın ve sonlandırma nedenini belirten bir değer döndürür. AfxEndThread işlevini veya deyimini return
kullanabilirsiniz. Genellikle, 0 başarıyla tamamlandığını gösterir, ancak bu size bağlı.
Kullanıcı arabirimi iş parçacığı için işlem de aynı şekilde basittir: kullanıcı arabirimi iş parçacığının içinden Windows SDK'sında PostQuitMessage'ı çağırın. Tek parametre PostQuitMessage
, iş parçacığının çıkış kodudur. Çalışan iş parçacıklarına gelince, 0 genellikle işlemin başarılı olduğunu gösterir.
Erken İş Parçacığı Sonlandırma
Bir iş parçacığını erken sonlandırmak neredeyse o kadar basittir: İş parçacığının içinden AfxEndThread çağrısı yapın. İstenen çıkış kodunu tek parametre olarak geçirin. Bu işlem iş parçacığının yürütülmesini durdurur, iş parçacığının yığınını serbest bırakır, iş parçacığına bağlı tüm DLL'leri ayırır ve iş parçacığı nesnesini bellekten siler.
AfxEndThread
sonlandırılacak iş parçacığının içinden çağrılmalıdır. Bir iş parçacığını başka bir iş parçacığından sonlandırmak istiyorsanız, iki iş parçacığı arasında bir iletişim yöntemi ayarlamanız gerekir.
İş Parçacığının Çıkış Kodunu Alma
Çalışanın veya kullanıcı arabirimi iş parçacığının çıkış kodunu almak için GetExitCodeThread işlevini çağırın. Bu işlev hakkında bilgi için bkz. Windows SDK' sı. Bu işlev tanıtıcıyı iş parçacığına (nesnelerin veri üyesinde m_hThread
CWinThread
depolanır) ve DWORD adresini alır.
İş parçacığı hala etkinse, GetExitCodeThread
sağlanan DWORD adresine STILL_ACTIVE yerleştirir; aksi takdirde çıkış kodu bu adrese yerleştirilir.
CWinThread nesnelerinin çıkış kodunu almak fazladan bir adım alır. Varsayılan olarak, bir CWinThread
iş parçacığı sonlandırıldığında, iş parçacığı nesnesi silinir. Bu, nesne artık mevcut olmadığından veri üyesine CWinThread
erişemeyeceğiniz m_hThread
anlamına gelir. Bu durumdan kaçınmak için aşağıdakilerden birini yapın:
Veri üyesini
m_bAutoDelete
FALSE olarak ayarlayın. Bu, iş parçacığı sonlandırıldıktan sonra nesnenin hayatta kalmasına olanak tanırCWinThread
. İş parçacığı sonlandırıldıktan sonra veri üyesine erişebilirsinizm_hThread
. Ancak bu tekniği kullanırsanız, çerçeve sizin için otomatik olarak silinmeyeceği için nesneyi yok etmekCWinThread
sizin sorumluluğundadır. Bu tercih edilen yöntemdir.İş parçacığının tutamacını ayrı ayrı depolayın. İş parçacığı oluşturulduktan sonra veri üyesini
m_hThread
(kullanarak::DuplicateHandle
) başka bir değişkene kopyalayın ve bu değişken aracılığıyla erişin. Bu şekilde sonlandırma gerçekleştiğinde nesne otomatik olarak silinir ve iş parçacığının neden sonlandırıldığını yine de öğrenebilirsiniz. Tutamacı çoğaltabilmeniz için önce iş parçacığının sonlandırılmaması için dikkatli olun. Bunun en güvenli yolu, CREATE_SUSPENDED AfxBeginThread'e geçirmek, tanıtıcıyı depolamak ve resumeThread çağırarak iş parçacığını sürdürmektir.
Her iki yöntem de bir CWinThread
nesnenin neden sonlandırıldığını belirlemenize olanak tanır.
Ayrıca bkz.
C++ ve MCF ile Çoklu İş Parçacığı Kullanımı
_endthread, _endthreadex
_beginthread, _beginthreadex
ExitThread