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.
A többszálas alkalmazások szigorúbb ápolást igényelnek, mint az egyszálas alkalmazások, hogy a műveletek a kívánt sorrendben történjenek, és a több szál által elért adatok ne sérüljenek. Ez a témakör a Microsoft Foundation Class (MFC) könyvtárral többszálú alkalmazások programozása során felmerülő lehetséges problémák elkerülésének technikáit ismerteti.
Objektumok elérése több szálból
Az MFC-objektumok önmagukban nem szálbiztosak. Két különálló szál nem tudja kezelni ugyanazt az objektumot, hacsak nem használja az MFC szinkronizálási osztályait és/vagy a megfelelő Win32 szinkronizálási objektumokat, például a kritikus szakaszokat. A kritikus szakaszokról és más kapcsolódó objektumokról további információt a Szinkronizálás a Windows SDK-ban című témakörben talál.
Az osztálytár belsőleg kritikus szakaszokat használ a globális adatstruktúrák, például a hibakeresési memóriafoglalás által használt adatstruktúrák védelmére.
MFC-objektumok elérése nem MFC-szálakból
Ha egy többszálas alkalmazás nem CWinThread-objektum használatával hoz létre szálat, akkor nem férhet hozzá az adott szál más MFC-objektumaihoz. Más szóval, ha egy másodlagos szálból szeretne hozzáférni az MFC-objektumokhoz, akkor ezt a szálat a többszálasításban leírt módszerek egyikével kell létrehoznia: User-Interface szálak vagy többszálasítás létrehozása: Feldolgozószálak létrehozása. Csak ezek a metódusok teszik lehetővé az osztálytár számára a többszálú alkalmazások kezeléséhez szükséges belső változók inicializálását.
Windows Fogantyútérképek
A szál általában csak az általa létrehozott MFC-objektumokat érheti el. Ennek az az oka, hogy az ideiglenes és állandó Windows-kezelőtérképek a szál helyi tárolójában vannak, hogy olyan védelmet biztosítsanak, amely megakadályozza a több szál egyidejű hozzáférését. Például egy feldolgozószál nem tud számítást végezni, majd meghívni egy dokumentum tagfüggvényét UpdateAllViews
, hogy módosítsa az ablakokat, amelyek az új adatok nézeteit tartalmazzák. Ennek nincs hatása, mert az objektumokból CWnd
a HWND-kre történő leképezés helyi az elsődleges szálban. Ez azt jelenti, hogy egy szál egy Windows-leírót egy C++ objektumhoz megfeleltetheti, de egy másik szál ugyanazt a leírót egy másik C++ objektumhoz is megfeleltetheti. Az egyik szálon végrehajtott módosítások nem jelennek meg a másikban.
A probléma megoldására több módszer is létezik. Az első az, hogy C++ objektumok helyett egyes fogópontokat (például HWND) kell átadni a munkavégző szálnak. A munkavégző szál ezután hozzáadja ezeket az objektumokat az ideiglenes térképhez a megfelelő FromHandle
tagfüggvény meghívásával. Az objektumot hívással Attach
is hozzáadhatja a szál állandó térképéhez, de ezt csak akkor szabad megtenni, ha garantáltan az objektum hosszabb ideig fog létezni, mint a szál.
Egy másik módszer az új, felhasználó által definiált üzenetek létrehozása, amely megfelel a feldolgozószálak által végrehajtandó különböző feladatoknak, és ezeket az üzeneteket közzéteheti az alkalmazás főablakában a használatával ::PostMessage
. Ez a kommunikációs módszer hasonló két különböző alkalmazáshoz, azzal a különbségtel, hogy mindkét szál ugyanabban a címtérben fut.
A térképek kezeléséről további információt a Technical Note 3 című témakörben talál. A szál helyi tárolásáról további információt a Szál helyi tárolója és a Szál helyi tároló használata a Windows SDK-ban című témakörben talál.
Kommunikáció szálak között
Az MFC számos osztályt biztosít, amelyek lehetővé teszik, hogy a szálak szinkronizálják az objektumokhoz való hozzáférést a szálbiztonság fenntartása érdekében. Ezeknek az osztályoknak a használatát a többszálúság ismerteti: A szinkronizálási osztályok és a többszálúság használata: Mikor érdemes használni a szinkronizálási osztályokat. További információ ezekről az objektumokról: Szinkronizálás a Windows SDK-ban.