Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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í AfxBeginThreadmůžete vytvořit -odvozený CWinThreadobjekt 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_SUSPENDEDSpusťte vlákno s počtem pozastavení jedné. PoužijteCREATE_SUSPENDED, pokud chcete inicializovat jakákoli členová data objektuCWinThread, napříkladm_bAutoDeletenebo jakékoli členy odvozené třídy, před spuštěním vlákna. Po dokončení inicializace spusťteCWinThread::ResumeThreadvlákno. Vlákno se nespustí, dokudCWinThread::ResumeThreadse 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_CRITICALTHREAD_PRIORITY_HIGHESTTHREAD_PRIORITY_ABOVE_NORMALTHREAD_PRIORITY_NORMALTHREAD_PRIORITY_BELOW_NORMALTHREAD_PRIORITY_LOWESTTHREAD_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 CWinAppa 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 NULLtento 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 NULLtento 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_MESSAGEmapy zpráv .
Poznámka:
Při volání PostThreadMessagese 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_CRITICALTHREAD_PRIORITY_HIGHESTTHREAD_PRIORITY_ABOVE_NORMALTHREAD_PRIORITY_NORMALTHREAD_PRIORITY_BELOW_NORMALTHREAD_PRIORITY_LOWESTTHREAD_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