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


Többszálú programozás: MFC programozási tippek

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 Attachis 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.

Lásd még

Többszálúság C++ és MFC használatával