Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Két normál helyzet miatt a szál leáll: a vezérlő függvény kilép, vagy a szál nem fejezheti be a futását. Ha egy szövegszerkesztő szálat használt a háttérnyomtatáshoz, a vezérlő függvény a nyomtatás sikeres befejezésekor a szokásos módon leáll. Ha azonban a felhasználó megszakítja a nyomtatást, a háttérnyomtatási szálat idő előtt le kell szakítani. Ez a témakör azt is ismerteti, hogyan implementálhatja az egyes helyzeteket, és hogyan szerezheti be egy szál kilépési kódját a leállása után.
Normál szál lezárás
Egy feldolgozószál esetében a normál szálvégzítés egyszerű: Lépjen ki a vezérlő függvényből, és adjon vissza egy értéket, amely a megszakítás okát jelzi. Használhatja az AfxEndThread függvényt vagy egy utasítást return . A 0 általában sikeres befejezést jelez, de ez Önön múlik.
Egy felhasználói felületi szál esetében a folyamat ugyanolyan egyszerű: a felhasználói felületi szálon belül hívja meg a PostQuitMessage-t a Windows SDK-ban. Az egyetlen paraméter, amelyet a PostQuitMessage elfogad, a szál kilépési kódja. A munkaszálak esetében a 0 általában a sikeres befejezést jelzi.
Korai szálvégzítés
A szál idő előtti leállása majdnem olyan egyszerű: Hívja meg az AfxEndThread parancsot a szálon belülről. Adja meg a kívánt kilépési kódot egyetlen paraméterként. Ez leállítja a szál végrehajtását, felszabadítja a szálhoz tartozó veremterületet, leválasztja a szálhoz csatlakoztatott összes DLL-t, és törli a szálhoz tartozó objektumot a memóriából.
A AfxEndThread meghívását a megszakítandó szálon belülről kell végrehajtani. Ha egy szálat egy másik szálról szeretne leállítani, be kell állítania egy kommunikációs módszert a két szál között.
Egy szál kilépési kódjának lekérése
A feldolgozó vagy a felhasználói felület szál kilépési kódjának lekéréséhez hívja meg a GetExitCodeThread függvényt . A függvényről további információt a Windows SDK-jában talál. Ez a függvény a leírót a szálhoz (az m_hThread objektumok adattagjában CWinThread tárolva) és a DWORD címéhez viszi.
Ha a szál továbbra is aktív, GetExitCodeThread a megadott DWORD-címre helyezi STILL_ACTIVE; ellenkező esetben a kilépési kód ebbe a címre kerül.
A CWinThread-objektumok kilépési kódjának beolvasása további lépést igényel. Alapértelmezés szerint egy CWinThread szál leállásakor a szálobjektum törlődik. Ez azt jelenti, hogy nem férhet hozzá az m_hThread adattaghoz, mert az CWinThread objektum már nem létezik. A helyzet elkerülése érdekében tegye az alábbiak egyikét:
Állítsa az
m_bAutoDeleteadattagot HAMIS értékre. Ez lehetővé teszi, hogy azCWinThreadobjektum túlélje a szál leállása után. Ezután a szál leállása után hozzáférhet azm_hThreadadattaghoz. Ha azonban ezt a technikát használja, ön a felelős azCWinThreadobjektum elpusztításáért, mert a keretrendszer nem törli automatikusan az Ön számára. Ez az előnyben részesített módszer.A szál fogópontját külön tárolja. A szál létrehozása után másolja az adattagját
m_hThreadegy másik változóba::DuplicateHandlehasználatával, és azon keresztül érje el. Így a rendszer automatikusan törli az objektumot a leállításkor, és továbbra is megtudhatja, hogy miért szakadt meg a szál. Ügyeljen arra, hogy a szál ne végződjön, mielőtt duplikálhatja a fogópontot. Ennek a legbiztonságosabb módja, ha a CREATE_SUSPENDED-et az AfxBeginThread-nek adja át, eltárolja a fogantyút, majd a ResumeThread meghívásával folytatja a szálat.
Bármelyik módszer lehetővé teszi annak meghatározását, hogy egy objektum miért CWinThread lett megszakítva.
Lásd még
Többszálúság C++ és MFC használatával
_endthread, _endthreadex
_beginthread, _beginthreadex
ExitThread