Megosztás a következőn keresztül:


Többszálú feldolgozás: Szálak leállítása az MFC-ben

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_bAutoDelete adattagot HAMIS értékre. Ez lehetővé teszi, hogy az CWinThread objektum túlélje a szál leállása után. Ezután a szál leállása után hozzáférhet az m_hThread adattaghoz. Ha azonban ezt a technikát használja, ön a felelős az CWinThread objektum 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_hThread egy másik változóba ::DuplicateHandle haszná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