Aracılığıyla paylaş


Ç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ır CWinThread . İş parçacığı sonlandırıldıktan sonra veri üyesine erişebilirsiniz m_hThread . Ancak bu tekniği kullanırsanız, çerçeve sizin için otomatik olarak silinmeyeceği için nesneyi yok etmek CWinThread 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