CWinThread
Třída
Představuje vlákno provádění v rámci aplikace.
Syntaxe
class CWinThread : public CCmdTarget
Členové
Veřejné konstruktory
Název | Popis |
---|---|
CWinThread::CWinThread |
CWinThread Vytvoří objekt. |
Veřejné metody
Název | Popis |
---|---|
CWinThread::CreateThread |
Spustí spuštění objektu CWinThread . |
CWinThread::ExitInstance |
Přepište, aby se po ukončení vlákna vyčistilo. |
CWinThread::GetMainWnd |
Načte ukazatel na hlavní okno vlákna. |
CWinThread::GetThreadPriority |
Získá prioritu aktuálního vlákna. |
CWinThread::InitInstance |
Přepsání pro inicializaci instance vlákna |
CWinThread::IsIdleMessage |
Kontroluje speciální zprávy. |
CWinThread::OnIdle |
Přepsáním provedete zpracování doby nečinnosti specifické pro vlákno. |
CWinThread::PostThreadMessage |
Publikuje zprávu do jiného CWinThread objektu. |
CWinThread::PreTranslateMessage |
Filtruje zprávy před jejich odesláním do funkcí TranslateMessage systému Windows a DispatchMessage . |
CWinThread::ProcessMessageFilter |
Zachytí určité zprávy před tím, než se dostanou k aplikaci. |
CWinThread::ProcessWndProcException |
Zachycuje všechny neošetřené výjimky vyvolané zprávou vlákna a obslužnými rutinami příkazů. |
CWinThread::PumpMessage |
Obsahuje smyčku zpráv vlákna. |
CWinThread::ResumeThread |
Sníží počet pozastavení vlákna. |
CWinThread::Run |
Ovládání funkce pro vlákna pomocí čerpadla zpráv. Přepsání pro přizpůsobení výchozí smyčky zpráv |
CWinThread::SetThreadPriority |
Nastaví prioritu aktuálního vlákna. |
CWinThread::SuspendThread |
Zvýší počet pozastavení vlákna. |
Veřejné operátory
Název | Popis |
---|---|
CWinThread::operator HANDLE |
Načte popisovač objektu CWinThread . |
Veřejné datové členy
Název | Popis |
---|---|
CWinThread::m_bAutoDelete |
Určuje, zda chcete zničit objekt při ukončení vlákna. |
CWinThread::m_hThread |
Popisovač aktuálního vlákna |
CWinThread::m_nThreadID |
ID aktuálního vlákna. |
CWinThread::m_pActiveWnd |
Ukazatel na hlavní okno aplikace kontejneru, pokud je server OLE na místě aktivní. |
CWinThread::m_pMainWnd |
Obsahuje ukazatel na hlavní okno aplikace. |
Poznámky
Hlavní vlákno provádění je obvykle poskytováno objektem odvozeným z CWinApp
; CWinApp
je odvozeno z CWinThread
. Další CWinThread
objekty umožňují více vláken v rámci dané aplikace.
Existují dva obecné typy vláken, které CWinThread
podporují: pracovní vlákna a vlákna uživatelského rozhraní. Pracovní vlákna nemají žádné čerpadlo zpráv: například vlákno, které provádí výpočty na pozadí v tabulkové aplikaci. Vlákna uživatelského rozhraní mají pumpu zpráv a zpracovávají zprávy přijaté ze systému. CWinApp
a třídy odvozené z něj jsou příklady vláken uživatelského rozhraní. Další vlákna uživatelského rozhraní lze také odvodit přímo z CWinThread
.
Objekty třídy CWinThread
obvykle existují po dobu trvání vlákna. Pokud chcete toto chování upravit, nastavte na hodnotu m_bAutoDelete
FALSE
.
Třída CWinThread
je nezbytná k tomu, aby kód a MFC byly plně bezpečné pro přístup z více vláken. Data místního vlákna používaná architekturou k údržbě informací specifických pro vlákno se spravují CWinThread
objekty. Z důvodu této závislosti na CWinThread
zpracování místních dat vláken musí být vytvořená všechna vlákna, která používá mfc. Například vlákno vytvořené funkcí _beginthread
_beginthreadex
za běhu nemůže použít žádná rozhraní API MFC.
Chcete-li vytvořit vlákno, zavolejte AfxBeginThread
. Existují dva formuláře v závislosti na tom, jestli chcete pracovní nebo uživatelské rozhraní vlákno. Pokud chcete vlákno uživatelského rozhraní, předejte AfxBeginThread
ukazatel na CRuntimeClass
vaši CWinThread
-odvozenou třídu. Pokud chcete vytvořit pracovní vlákno, předejte AfxBeginThread
ukazatel na řídicí funkci a parametr řídicí funkci. Pro pracovní vlákna i vlákna uživatelského rozhraní můžete zadat volitelné parametry, které upravují prioritu, velikost zásobníku, příznaky vytváření a atributy zabezpečení. AfxBeginThread
vrátí ukazatel na nový CWinThread
objekt.
Místo volání AfxBeginThread
můžete vytvořit -odvozený CWinThread
objekt a pak volat CreateThread
. Tato dvoufázová metoda konstrukce je užitečná, pokud chcete znovu použít CWinThread
objekt mezi následným vytvořením a ukončením provádění vláken.
Další informace o CWinThread
, naleznete v článcích Multithreading s C++ a MFC, Multithreading: Vytváření vláken uživatelského rozhraní, multithreading: Vytváření pracovních vláken a multithreading: Jak používat synchronizační třídy.
Hierarchie dědičnosti
CWinThread
Požadavky
Záhlaví: afxwin.h
CWinThread::CreateThread
Vytvoří vlákno, které se spustí v adresním prostoru volajícího procesu.
BOOL CreateThread(
DWORD dwCreateFlags = 0,
UINT nStackSize = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);
Parametry
dwCreateFlags
Určuje další příznak, který řídí vytvoření vlákna. Tento příznak může obsahovat jednu ze dvou hodnot:
CREATE_SUSPENDED
Spusťte vlákno s počtem pozastavení jedné. PoužijteCREATE_SUSPENDED
, pokud chcete inicializovat jakákoli členová data objektuCWinThread
, napříkladm_bAutoDelete
nebo jakékoli členy odvozené třídy, před spuštěním vlákna. Po dokončení inicializace spusťteCWinThread::ResumeThread
vlákno. Vlákno se nespustí, dokudCWinThread::ResumeThread
se nevolá.0 Spusťte vlákno ihned po vytvoření.
nStackSize
Určuje velikost v bajtech zásobníku pro nové vlákno. Pokud 0, velikost zásobníku je ve výchozím nastavení stejná jako u primárního vlákna procesu.
lpSecurityAttrs
Odkazuje na SECURITY_ATTRIBUTES
strukturu, která určuje atributy zabezpečení pro vlákno.
Návratová hodnota
Nenulové, pokud je vlákno úspěšně vytvořeno; jinak 0.
Poznámky
Slouží AfxBeginThread
k vytvoření objektu vlákna a jeho spuštění v jednom kroku. Použijte CreateThread
, pokud chcete znovu použít objekt vlákna mezi následným vytvořením a ukončením provádění vláken.
CWinThread::CWinThread
CWinThread
Vytvoří objekt.
CWinThread();
Poznámky
Spuštění vlákna zahájíte voláním CreateThread
členské funkce. Obvykle vytvoříte vlákna voláním AfxBeginThread
, který bude volat tento konstruktor a CreateThread
.
CWinThread::ExitInstance
Volá se rozhraním z zřídka přepsané Run
členské funkce pro ukončení této instance vlákna nebo v případě selhání volání InitInstance
.
virtual int ExitInstance();
Návratová hodnota
Ukončovací kód vlákna; 0 značí žádné chyby a hodnoty větší než 0 označují chybu. Tuto hodnotu lze načíst voláním GetExitCodeThread
.
Poznámky
Tuto členovu funkci nevolejte odkudkoli, ale v rámci Run
členské funkce. Tato členová funkce se používá pouze ve vláknech uživatelského rozhraní.
Výchozí implementace této funkce odstraní CWinThread
objekt, pokud m_bAutoDelete
je TRUE
. Tuto funkci přepište, pokud chcete provést další vyčištění po ukončení vlákna. ExitInstance
Implementace by měla po spuštění kódu volat verzi základní třídy.
CWinThread::GetMainWnd
Pokud je vaše aplikace serverem OLE, zavolejte tuto funkci, která načte ukazatel na aktivní hlavní okno aplikace místo přímého odkazování na m_pMainWnd
člena objektu aplikace.
virtual CWnd* GetMainWnd();
Návratová hodnota
Tato funkce vrátí ukazatel na jeden ze dvou typů oken. Pokud je vlákno součástí serveru OLE a má objekt, který je v aktivním kontejneru aktivní, vrátí CWinApp::m_pActiveWnd
tato funkce datový člen objektu CWinThread
.
Pokud není v kontejneru aktivní žádný objekt nebo aplikace není server OLE, vrátí m_pMainWnd
tato funkce datový člen objektu vlákna.
Poznámky
U vláken uživatelského rozhraní je to ekvivalentem přímého odkazování na m_pActiveWnd
člena objektu vaší aplikace.
Pokud vaše aplikace není serverEM OLE, volání této funkce je ekvivalentní přímo odkazování na m_pMainWnd
člena objektu aplikace.
Přepište tuto funkci tak, aby změnila výchozí chování.
CWinThread::GetThreadPriority
Získá aktuální úroveň priority vlákna tohoto vlákna.
int GetThreadPriority();
Návratová hodnota
Aktuální úroveň priority vlákna v rámci své třídy priority. Vrácená hodnota bude jedna z následujících hodnot, která je uvedena od nejvyšší priority po nejnižší:
THREAD_PRIORITY_TIME_CRITICAL
THREAD_PRIORITY_HIGHEST
THREAD_PRIORITY_ABOVE_NORMAL
THREAD_PRIORITY_NORMAL
THREAD_PRIORITY_BELOW_NORMAL
THREAD_PRIORITY_LOWEST
THREAD_PRIORITY_IDLE
Další informace o těchto prioritách najdete SetThreadPriority
v sadě Windows SDK.
CWinThread::InitInstance
InitInstance
je nutné přepsat, aby se inicializovala každá nová instance vlákna uživatelského rozhraní.
virtual BOOL InitInstance();
Návratová hodnota
Nenulové, pokud je inicializace úspěšná; jinak 0.
Poznámky
Obvykle přepíšete InitInstance
provádění úloh, které musí být dokončeny při prvním vytvoření vlákna.
Tato členová funkce se používá pouze ve vláknech uživatelského rozhraní. Inicializace pracovních vláken v řídicí funkci předané do AfxBeginThread
.
CWinThread::IsIdleMessage
Tuto funkci přepište, aby se po vygenerování konkrétních zpráv nevolala OnIdle
.
virtual BOOL IsIdleMessage(MSG* pMsg);
Parametry
pMsg
Odkazuje na zpracovávanou aktuální zprávu.
Návratová hodnota
Nenulové, pokud OnIdle
by mělo být volána po zpracování zprávy; jinak 0.
Poznámky
Výchozí implementace nevyvolá OnIdle
po redundantních zprávách myši a zprávách generovaných blikajícími karety.
Pokud aplikace vytvořila krátký časovač, OnIdle
bude se často volat, což způsobuje problémy s výkonem. Pokud chcete zlepšit výkon takové aplikace, přepište IsIdleMessage
ji v odvozené třídě aplikace CWinApp
a zkontrolujte WM_TIMER
zprávy následujícím způsobem:
BOOL CMyWinApp::IsIdleMessage(MSG* pMsg)
{
if (!CWinApp::IsIdleMessage(pMsg) || pMsg->message == WM_TIMER)
return FALSE;
else
return TRUE;
}
Zpracování WM_TIMER
tímto způsobem zlepší výkon aplikací, které používají krátké časovače.
CWinThread::m_bAutoDelete
Určuje, zda CWinThread
má být objekt automaticky odstraněn při ukončení vlákna.
BOOL m_bAutoDelete;
Poznámky
Datový m_bAutoDelete
člen je veřejná proměnná typu BOOL.
Hodnota m_bAutoDelete
nemá vliv na zavření podkladového popisovače vlákna, ale má vliv na časování zavření úchytu. Popisovač vlákna je vždy uzavřen při zničení objektu CWinThread
.
CWinThread::m_hThread
Úchyt pro vlákno připojené k tomuto CWinThread
.
HANDLE m_hThread;
Poznámky
Datový m_hThread
člen je veřejná proměnná typu HANDLE
. Platí pouze v případě, že aktuálně existuje základní objekt vlákna jádra a popisovač ještě nebyl uzavřen.
Destruktor CWinThread
volá CloseHandle
m_hThread
. Pokud m_bAutoDelete
je TRUE
vlákno ukončeno, CWinThread
objekt je zničen, což zneplatňuje všechny ukazatele na CWinThread
objekt a jeho členské proměnné. Možná budete muset m_hThread
člena zkontrolovat hodnotu ukončení vlákna nebo počkat na signál. Chcete-li zachovat CWinThread
objekt a jeho m_hThread
člen během provádění vlákna a po jeho ukončení, nastavte na FALSE
před m_bAutoDelete
povolením provádění vlákna pokračovat. V opačném případě může vlákno ukončit, zničit CWinThread
objekt a zavřít popisovač před pokusem o jeho použití. Pokud používáte tuto techniku, zodpovídáte za odstranění objektu CWinThread
.
CWinThread::m_nThreadID
ID vlákna připojeného k tomuto CWinThread
.
DWORD m_nThreadID;
Poznámky
Datový m_nThreadID
člen je veřejná proměnná typu DWORD
. Platí pouze v případě, že aktuálně existuje základní objekt vlákna jádra.
Podívejte se také na poznámky o m_hThread
životě.
Příklad
Podívejte se na příklad pro AfxGetThread
.
CWinThread::m_pActiveWnd
Tento datový člen slouží k uložení ukazatele na aktivní objekt okna vlákna.
CWnd* m_pActiveWnd;
Poznámky
Knihovna tříd Microsoft Foundation automaticky ukončí vaše vlákno při zavření okna, na které m_pActiveWnd
odkazuje. Pokud je toto vlákno primárním vláknem pro aplikaci, aplikace se také ukončí. Pokud je NULL
tento datový člen, zdědí se aktivní okno objektu aplikace CWinApp
. m_pActiveWnd
je veřejná proměnná typu CWnd*
.
Obvykle nastavíte tuto člennou proměnnou při přepsání InitInstance
. V pracovním vlákně je hodnota tohoto datového členu zděděna z nadřazeného vlákna.
CWinThread::m_pMainWnd
Tento datový člen slouží k uložení ukazatele na hlavní objekt okna vlákna.
CWnd* m_pMainWnd;
Poznámky
Knihovna tříd Microsoft Foundation automaticky ukončí vaše vlákno při zavření okna, na které m_pMainWnd
odkazuje. Pokud je toto vlákno primárním vláknem pro aplikaci, aplikace se také ukončí. Pokud je NULL
tento datový člen , hlavní okno objektu aplikace CWinApp
se použije k určení, kdy se má vlákno ukončit. m_pMainWnd
je veřejná proměnná typu CWnd*
.
Obvykle nastavíte tuto člennou proměnnou při přepsání InitInstance
. V pracovním vlákně je hodnota tohoto datového členu zděděna z nadřazeného vlákna.
CWinThread::OnIdle
Přepište tuto členovou funkci tak, aby prováděla zpracování nečinnosti.
virtual BOOL OnIdle(LONG lCount);
Parametry
lCount
Čítač se při každém OnIdle
vyvolání, když je fronta zpráv vlákna prázdná. Tento počet se při každém zpracování nové zprávy resetuje na 0. Pomocí parametru lCount
můžete určit relativní dobu nečinnosti vlákna bez zpracování zprávy.
Návratová hodnota
Nenulové pro příjem více doby zpracování nečinnosti; 0, pokud už není potřeba doba zpracování nečinnosti.
Poznámky
OnIdle
je volána ve výchozí smyčce zpráv, pokud je fronta zpráv vlákna prázdná. Pomocí přepsání můžete volat vlastní úlohy obslužné rutiny nečinnosti na pozadí.
OnIdle
by mělo vrátit hodnotu 0, aby bylo uvedeno, že není vyžadována žádná další doba zpracování nečinnosti. Parametr lCount
se při každém OnIdle
zavolání, když je fronta zpráv prázdná a při každém zpracování nové zprávy se resetuje na 0. Na základě tohoto počtu můžete volat různé nečinné rutiny.
Výchozí implementace této členské funkce uvolní dočasné objekty a nepoužívané dynamické knihovny propojení z paměti.
Tato členová funkce se používá pouze ve vláknech uživatelského rozhraní.
Vzhledem k tomu, že aplikace nemůže zpracovávat zprávy, dokud OnIdle
se nevrátí, neprovádějte v této funkci zdlouhavé úlohy.
CWinThread::operator HANDLE
Načte popisovač objektu CWinThread
.
operator HANDLE() const;
Návratová hodnota
V případě úspěchu popisovač objektu vlákna; v opačném případě . NULL
Poznámky
Pomocí popisovače můžete přímo volat rozhraní API systému Windows.
CWinThread::PostThreadMessage
Volá se k publikování uživatelem definované zprávy do jiného CWinThread
objektu.
BOOL PostThreadMessage(
UINT message,
WPARAM wParam,
LPARAM lParam);
Parametry
message
ID uživatelem definované zprávy.
wParam
První parametr zprávy
lParam
Druhý parametr zprávy.
Návratová hodnota
Nenulové, pokud je úspěšné; jinak 0.
Poznámky
Publikovaná zpráva je mapována na správnou obslužnou rutinu zprávy pomocí makra ON_THREAD_MESSAGE
mapy zpráv .
Poznámka:
Při volání PostThreadMessage
se zpráva umístí do fronty zpráv ve vlákně. Vzhledem k tomu, že zprávy publikované tímto způsobem nejsou přidruženy k oknu, mfc je neodesílají do obslužných rutin zpráv nebo příkazů. Chcete-li zpracovat tyto zprávy, přepište PreTranslateMessage()
funkci třídy CWinApp
-odvozené a zpracovat zprávy ručně.
CWinThread::PreTranslateMessage
Tuto funkci přepište tak, aby filtrovala zprávy oken před jejich odesláním do funkcí TranslateMessage
systému Windows a DispatchMessage
.
virtual BOOL PreTranslateMessage(MSG* pMsg);
Parametry
pMsg
Odkazuje na MSG
strukturu obsahující zprávu ke zpracování.
Návratová hodnota
Nenulové, pokud byla zpráva plně zpracována PreTranslateMessage
a neměla by být zpracována dále. Nula, pokud by zpráva měla být zpracována normálním způsobem.
Poznámky
Tato členová funkce se používá pouze ve vláknech uživatelského rozhraní.
CWinThread::ProcessMessageFilter
Funkce háku architektury volá tuto členskou funkci k filtrování a odpovídání na určité zprávy systému Windows.
virtual BOOL ProcessMessageFilter(
int code,
LPMSG lpMsg);
Parametry
code
Určuje kód háku. Tato členová funkce používá kód k určení způsobu zpracování lpMsg
.
lpMsg
Ukazatel na strukturu WindowsMSG
.
Návratová hodnota
Nenulové, pokud je zpráva zpracována; jinak 0.
Poznámky
Funkce hook zpracovává události před jejich odesláním do normálního zpracování zpráv aplikace.
Pokud tuto pokročilou funkci přepíšete, nezapomeňte volat verzi základní třídy, aby se zachovalo zpracování háku architektury.
CWinThread::ProcessWndProcException
Architektura volá tuto členskou funkci pokaždé, když obslužná rutina nezachytí výjimku vyvolanou v jedné ze zpráv nebo obslužných rutin příkazů ve vlákně.
virtual LRESULT ProcessWndProcException(
CException* e,
const MSG* pMsg);
Parametry
e
Odkazuje na neošetřenou výjimku.
pMsg
Odkazuje na MSG
strukturu obsahující informace o zprávě systému Windows, která způsobila, že architektura vyvolala výjimku.
Návratová hodnota
-1, pokud WM_CREATE
je vygenerována výjimka, jinak 0.
Poznámky
Tuto členovu funkci nevolejte přímo.
Výchozí implementace této členské funkce zpracovává pouze výjimky vygenerované z následujících zpráv:
Příkaz | Akce |
---|---|
WM_CREATE |
Selhat. |
WM_PAINT |
Ověřte ovlivněné okno, čímž zabráníte generování jiné WM_PAINT zprávy. |
Přepište tuto členovou funkci tak, aby poskytovala globální zpracování výjimek. Základní funkce volejte jenom v případě, že chcete zobrazit výchozí chování.
Tato členová funkce se používá pouze ve vláknech s pumpou zpráv.
CWinThread::PumpMessage
Obsahuje smyčku zpráv vlákna.
virtual BOOL PumpMessage();
Poznámky
PumpMessage
obsahuje smyčku zpráv vlákna. PumpMessage
je volána CWinThread
tak, aby pumpuje zprávy vlákna. Můžete volat PumpMessage
přímo tak, aby se zprávy zpracovávaly, nebo můžete přepsat PumpMessage
, aby se změnilo výchozí chování.
Volání PumpMessage
přímo a přepsání výchozího chování se doporučuje jenom pro pokročilé uživatele.
CWinThread::ResumeThread
Volá se k obnovení provádění vlákna, které bylo pozastaveno SuspendThread
členovou funkcí, nebo vlákno vytvořené příznakem CREATE_SUSPENDED
.
DWORD ResumeThread();
Návratová hodnota
Předchozí počet pozastavení vlákna v případě úspěchu; 0xFFFFFFFF
jinak. Pokud je návratová hodnota nula, aktuální vlákno nebylo pozastaveno. Pokud je vrácená hodnota jedna, vlákno bylo pozastaveno, ale nyní je restartováno. Jakákoli návratová hodnota větší než jedna znamená, že vlákno zůstane pozastavené.
Poznámky
Počet pozastavení aktuálního vlákna je snížen o jeden. Pokud se počet pozastavení sníží na nulu, vlákno obnoví provádění; jinak zůstane vlákno pozastaveno.
CWinThread::Run
Poskytuje výchozí smyčku zpráv pro vlákna uživatelského rozhraní.
virtual int Run();
Návratová hodnota
Hodnota int
vrácená vláknem. Tuto hodnotu lze načíst voláním GetExitCodeThread
.
Poznámky
Run
získává a odesílá zprávy systému Windows, dokud aplikace neobdrží WM_QUIT
zprávu. Pokud fronta zpráv ve vlákně aktuálně neobsahuje žádné zprávy, Run
volání OnIdle
k provedení zpracování nečinnosti. Příchozí zprávy přejdou do PreTranslateMessage
členské funkce pro speciální zpracování a pak do funkce TranslateMessage
Windows pro standardní překlad klávesnice. DispatchMessage
Nakonec se volá funkce Windows.
Run
zřídka se přepisuje, ale můžete ji přepsat tak, aby implementovaly speciální chování.
Tato členová funkce se používá pouze ve vláknech uživatelského rozhraní.
CWinThread::SetThreadPriority
Tato funkce nastaví úroveň priority aktuálního vlákna v rámci své třídy priority.
BOOL SetThreadPriority(int nPriority);
Parametry
nPriority
Určuje novou úroveň priority vlákna v rámci své třídy priority. Tento parametr musí být jednou z následujících hodnot uvedených od nejvyšší priority po nejnižší:
THREAD_PRIORITY_TIME_CRITICAL
THREAD_PRIORITY_HIGHEST
THREAD_PRIORITY_ABOVE_NORMAL
THREAD_PRIORITY_NORMAL
THREAD_PRIORITY_BELOW_NORMAL
THREAD_PRIORITY_LOWEST
THREAD_PRIORITY_IDLE
Další informace o těchto prioritách najdete SetThreadPriority
v sadě Windows SDK.
Návratová hodnota
Nenulové, pokud byla funkce úspěšná; jinak 0.
Poznámky
Lze ji volat pouze po CreateThread
úspěšném vrácení.
CWinThread::SuspendThread
Zvýší počet pozastavení aktuálního vlákna.
DWORD SuspendThread();
Návratová hodnota
Předchozí počet pozastavení vlákna v případě úspěchu; 0xFFFFFFFF
jinak.
Poznámky
Pokud má jakékoli vlákno počet pozastavení nad nulou, toto vlákno se nespustí. Vlákno lze obnovit voláním ResumeThread
členské funkce.
Viz také
CCmdTarget
Třída
Graf hierarchie
CWinApp
Třída
CCmdTarget
Třída