Aracılığıyla paylaş


Çoklu İş Parçacığı Kullanımı: İş Parçacıklarını Sonlandırma

Bir iş parçacığının sonlandırılmasına iki durum neden olur: denetleyen işlev çıkar veya iş parçacığının tamamlanmaya kadar çalışmasına izin verilmez.Eğer bir sözcük işlemcisi arka plan yazdırması için iş parçacığı kullanmışsa, yazdırma başarılı bir şekilde tamamlanmışsa denetleyen işlev normal olarak sonlanırdı.Ancak kullanıcı yazdırmayı iptal etmek isterse, arka plan yazdırma iş parçacığının erken sonlandırılmalıdır.Bu konu hem her durumun nasıl uygulanacağını hem de iş parçacığı sonlandırıldıktan sonra çıkış kodunun nasıl alınacağını açıklar.

  • Normal İş Parçacığı Sonlandırma

  • Erken İş Parçacığı Sonlandırma

  • İş Parçacığı Çıkış Kodunu Alma

Normal İş Parçacığı Sonlandırma

İş parçacığı için, normal iş paçacığının sonlandırılması basittir: Denetleyen işlevden çıkın ve sonlandırma sebebini belirten bir değer dönün.Ya AfxEndThread işlevini ya da return ifadesini kullanabilirsiniz.Genellikle, 0 başarılı tamamlamayı belirtir, ama bu size kalmış.

Kullanıcı arabirimi iş parçacığı için, işlemi bu kadar basittir: kullanıcı arabirimi iş parçacığı içinde, Windows SDK içindeki PostQuitMessage çağırın.PostQuitMessage'ın aldığı tek parametre iş parçacığının çıkış kodudur.İşçi iş parçacıkları için 0 genellikle başarılı tamamlamayı belirtir.

Erken İş Parçacığı Sonlandırma

Bir izleğin vaktinden önce sonlandırılması, neredeyse şunun kadar basittir: izlek içerisinden AfxEndThread'yi çağırma.İstenen sonlandırma kodunu tek parametre olarak geçir.Bu iş parçacığının yürütmesini durdurur, iş parçacığının yığınını kaldırır, iş parçacığına bağlı olan bütün DLL'leri ayırır ve bellekten iş parçacığı nesnesini siler.

AfxEndThread sonlandırılacak olan iş parçacığının içinden çağrılmalıdır.Eğer bir iş parçacığını başka bir iş parçacığından sonlandırmak isterseniz, iki iş parçacığı arasında iletişim yöntemi kurmalısınız.

İş Parçacığı Çıkış Kodunu Alma

Hem işçi hem de kullanıcı arayüzü iş parçacıklarının çıkış kodunu almak için GetExitCodeThread işlevini çağırın.Bu işlev hakkında bilgi için, bkz. Windows SDK.Bu işlev iş parçacığına olan işleyiciyi (CWinThread'in m_hThread veri üyesinde saklanan) ve DWORD adresini alır.

İş parçacığı hala etkinse, GetExitCodeThread sağlanan DWORD adresinde STILL_ACTIVE'i yerleştirir, aksi takdirde bu adrese çıkış kodu yerleştirilir.

CWinThread nesnesinin çıkış kodunu almak fazladan bir adım daha gerekir.Varsayılan olarak, CWinThread iş parçacığı sonlandırıldığında, iş parçacığı nesnesi silinir.Bu m_hThread veri üyesine erişemeyeceğiniz anlamına gelir, çünkü CWinThread nesnesi artık yoktur.Bu durumu önlemek için, aşağıdakilerden birini yapın:

  • m_bAutoDelete veri üyesini FALSE'a ayarlayın.Bu, iş parçacığı sonlandırıldıktan sonra CWinThread nesnesinin varlığını sürdürmesini sağlar. İş parçacığı sonlandırıldıktan sonra, m_hThread veri üyesine erişebilirsiniz.Ancak bu yöntemi kullanırsanız, CWinThread nesnesini yok etmek sizin sorumluluğunuzdur, çünkü framework sizin için otomatik olarak silmez.Bu tercih edilen yöntemdir.

  • İş parçacıklarının işleyicilerini ayrı saklayın.İş parçacığı oluşturulduktan sonra, m_hThread veri üyesini başka bir değişkene kopyalayın (::DuplicateHandle'ı kullanarak) ve bu değişken üzerinden erişin.Bu şekilde sonlandırma olduğunda nesne otomatik olarak silinir ve siz de iş parçacığının neden sonlandığını öğrenebilirsiniz.İş parçacığının siz işleyiciyi kopyalamadan önce sonlanmamasına dikkat ediniz.Bunu yapmanın en güvenli yolu AfxBeginThread'e CREATE_SUSPENDED'ı geçirmek, işleyiciyi saklamak ve sonra iş parçacığını ResumeThread'i çağırarak devam ettirmektir.

Her iki yöntem de CWinThread nesnesinin neden sonlandığını belirlemenizi sağlar.

Ayrıca bkz.

Başvuru

_endthread, _endthreadex

_beginthread, _beginthreadex

ExitThread

Kavramlar

C++ ve mfc çoklu kullanım