Multithreading: Vytváření vláken uživatelského rozhraní
Vlákno uživatelského rozhraní se běžně používá ke zpracování uživatelského vstupu a reaguje na události uživatele nezávisle na tom, zda vlákna spouští ostatní části aplikace. Hlavní aplikační vlákno (obsahuje odvozená třída CWinApp) je již vytvořeno a spuštěno za vás. Toto téma popisuje kroky, které jsou nezbytné k vytvoření dalších vláken uživatelského rozhraní.
První krok, který je nutné provést při vytváření vlákna uživatelského rozhraní, je odvození třídy z CWinThread. Je nutné deklarovat a implementovat tuto třídu pomocí makra DECLARE_DYNCREATE a IMPLEMENT_DYNCREATE. Tato třída musí přepsat některé funkce a může přepsat další. V následující tabulce jsou uvedeny tyto funkce a co by měly dělat.
Funkce pro přepsání při vytváření vlákna uživatelského rozhraní
Function |
Účel |
---|---|
Po ukončení vlákna provede vyčištění. Obvykle přepsána. |
|
Provede inicializaci instance vlákna. Musí být přepsána. |
|
Provádění zpracování doby nečinnosti specifické pro vlákno. Obvykle není přepsána. |
|
Filtruje zprávy dříve, než jsou odeslány do TranslateMessage a DispatchMessage. Obvykle není přepsána. |
|
Zachycuje neošetřené výjimky vyvolané zprávou vlákna a obslužnou rutinou příkazů. Obvykle není přepsána. |
|
Řídící funkce pro vlákno. Obsahuje message pump. Zřídkakdy přepsána. |
Knihovna MFC obsahuje dvě verze AfxBeginThread pomocí parametru přetížení: jednu pro vlákna uživatelského rozhraní a druhou pro pracovní vlákna. Chcete-li spustit vlákno uživatelského rozhraní, zavolejte AfxBeginThread, která poskytuje následující informace:
RUNTIME_CLASS třídy, která je odvozená z CWinThread.
(nepovinný) Požadovaná úroveň priority. Výchozí hodnota je normální priorita. Další informace o možných úrovních priority naleznete v tématu SetThreadPriority v Windows SDK.
(nepovinný) Požadovaná velikost zásobníku pro vlákno. Výchozí hodnota je stejná velikost zásobníku jako u vytvářeného vlákna.
(nepovinný) CREATE_SUSPENDED pokud chcete, aby bylo vlákno vytvořeno v pozastaveném stavu. Výchozí hodnota je 0 nebo normální spuštění vlákna.
(nepovinný) Požadované atributy zabezpečení. Výchozí hodnota je stejný přístup jako nadřazené vlákno. Další informace o formátu informace zabezpečení naleznete v tématu SECURITY_ATTRIBUTES v Windows SDK.
AfxBeginThread provede většinu práce za vás. Vytvoří nový objekt vaší třídy, inicializuje ji pomocí informací, které dodáte a volá CWinThread::CreateThread, která spustí provádění vlákna. Kontroly jsou prováděny v celém procesu, aby bylo zajištěno, že všechny objekty jsou správně zrušeny, takže by neměla selhat žádná část tvorby.