Sdílet prostřednictvím


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í 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

CObject

CCmdTarget

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žijte CREATE_SUSPENDED , pokud chcete inicializovat jakákoli členová data objektu CWinThread , například m_bAutoDelete nebo jakékoli členy odvozené třídy, před spuštěním vlákna. Po dokončení inicializace spusťte CWinThread::ResumeThread vlákno. Vlákno se nespustí, dokud CWinThread::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 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_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