Sdílet prostřednictvím


CThreadPool – třída

Tato třída poskytuje fond pracovních vláken, které zpracovávají frontu pracovních položek.

Syntaxe

template <class Worker, class ThreadTraits = DefaultThreadTraits>
class CThreadPool : public IThreadPoolConfig

Parametry

Pracovní podproces
Třída odpovídá archetypu pracovního procesu, který poskytuje kód použitý ke zpracování pracovních položek zařazených do fronty ve fondu vláken.

ThreadTraits
Třída poskytující funkci použitou k vytvoření vláken ve fondu.

Členové

Veřejné konstruktory

Název Popis
CThreadPool::CThreadPool Konstruktor fondu vláken.
CThreadPool::~CThreadPool Destruktor fondu vláken.

Veřejné metody

Název Popis
CThreadPool::AddRef Provádění .IUnknown::AddRef
CThreadPool::GetNumThreads Voláním této metody získáte počet vláken ve fondu.
CThreadPool::GetQueueHandle Voláním této metody získáte popisovač portu dokončení vstupně-výstupních operací, který se používá k frontě pracovních položek.
CThreadPool::GetSize Voláním této metody získáte počet vláken ve fondu.
CThreadPool::GetTimeout Voláním této metody získáte maximální dobu v milisekundách, kterou fond vláken počká, až se vlákno vypne.
CThreadPool::Initialize Voláním této metody inicializujete fond vláken.
CThreadPool::QueryInterface Provádění .IUnknown::QueryInterface
CThreadPool::QueueRequest Voláním této metody zařadíte pracovní položku do fronty, kterou bude zpracovávat vlákno ve fondu.
CThreadPool::Release Provádění .IUnknown::Release
CThreadPool::SetSize Voláním této metody nastavíte počet vláken ve fondu.
CThreadPool::SetTimeout Voláním této metody nastavíte maximální dobu v milisekundách, po kterou bude fond vláken čekat, až se vlákno vypne.
CThreadPool::Shutdown Voláním této metody ukončete fond vláken.

Poznámky

Vlákna ve fondu se vytvoří a zničí při inicializaci, změně velikosti nebo vypnutí fondu. Instance třídy Worker bude vytvořena v zásobníku každého pracovního vlákna ve fondu. Každá instance bude žít po celou dobu života vlákna.

Okamžitě po vytvoření vlákna bude pracovní proces::Initialize volán u objektu přidruženého k danému vláknu. Bezprostředně před zničením vlákna bude volán pracovní proces::Terminate Obě metody musí přijmout void* argument. Hodnota tohoto argumentu se předává fondu vláken prostřednictvím parametru pvWorkerParam CThreadPool::Initialize.

Pokud jsou pracovní položky ve frontě a pracovních vláknech k dispozici pro práci, pracovní vlákno stáhne položku z fronty a zavolá Execute metodu pracovního objektu pro dané vlákno. Metodě se pak předají tři položky: položka z fronty, stejná předaná Worker:: Initialize and Worker:: Terminatea ukazatel na strukturu OVERLAPPED použitou pro frontu portů dokončení vstupně-výstupních pvWorkerParam operací.

Třída Worker deklaruje typ položek, které budou zařazeny do fronty ve fondu vláken poskytnutím typedef, Worker:: RequestType. Tento typ musí být schopný přetypovat do a z ULONG_PTR.

Příkladem třídy Worker je CNonStatelessWorker Třída.

Hierarchie dědičnosti

IUnknown

IThreadPoolConfig

CThreadPool

Požadavky

Hlavička: atlutil.h

CThreadPool::AddRef

Provádění .IUnknown::AddRef

ULONG STDMETHODCALLTYPE AddRef() throw();

Návratová hodnota

Vždy vrátí hodnotu 1.

Poznámky

Tato třída neimplementuje řízení životnosti pomocí počítání odkazů.

CThreadPool::CThreadPool

Konstruktor fondu vláken.

CThreadPool() throw();

Poznámky

Inicializuje hodnotu časového limitu na ATLS_DEFAULT_THREADPOOLSHUTDOWNTIMEOUT. Výchozí čas je 36 sekund. V případě potřeby můžete před zahrnutím hodnoty atlutil.h definovat pro tento symbol vlastní kladnou celočíselnou hodnotu.

CThreadPool::~CThreadPool

Destruktor fondu vláken.

~CThreadPool() throw();

Poznámky

Volá CThreadPool::Shutdown.

CThreadPool::GetNumThreads

Voláním této metody získáte počet vláken ve fondu.

int GetNumThreads() throw();

Návratová hodnota

Vrátí počet vláken ve fondu.

CThreadPool::GetQueueHandle

Voláním této metody získáte popisovač portu dokončení vstupně-výstupních operací, který se používá k frontě pracovních položek.

HANDLE GetQueueHandle() throw();

Návratová hodnota

Vrátí popisovač fronty nebo hodnotu NULL, pokud fond vláken nebyl inicializován.

CThreadPool::GetSize

Voláním této metody získáte počet vláken ve fondu.

HRESULT STDMETHODCALLTYPE GetSize(int* pnNumThreads) throw();

Parametry

pnNumThreads
[ven] Adresa proměnné, která při úspěchu obdrží počet vláken ve fondu.

Návratová hodnota

Vrátí S_OK při úspěchu nebo chybu HRESULT při selhání.

CThreadPool::GetTimeout

Voláním této metody získáte maximální dobu v milisekundách, kterou fond vláken počká, až se vlákno vypne.

HRESULT STDMETHODCALLTYPE GetTimeout(DWORD* pdwMaxWait) throw();

Parametry

pdwMaxWait
[ven] Adresa proměnné, která při úspěchu obdrží maximální dobu v milisekundách, po kterou fond vláken počká, než se vlákno vypne.

Návratová hodnota

Vrátí S_OK při úspěchu nebo chybu HRESULT při selhání.

Poznámky

Tuto hodnotu časového limitu používá CThreadPool::Shutdown , pokud do této metody není zadána žádná jiná hodnota.

CThreadPool::Initialize

Voláním této metody inicializujete fond vláken.

HRESULT Initialize(
    void* pvWorkerParam = NULL,
    int nNumThreads = 0,
    DWORD dwStackSize = 0,
    HANDLE hCompletion = INVALID_HANDLE_VALUE) throw();

Parametry

pvWorkerParam
Parametr pracovního procesu, který má být předán objektu Initializepracovního vlákna , Executea Terminate metody.

nNumThreads
Požadovaný počet vláken ve fondu.

Pokud je argument nNumThreads záporný, jeho absolutní hodnota se vynásobí počtem procesorů v počítači, aby se získal celkový počet vláken.

Pokud je nNumThreads nula, ATLS_DEFAULT_THREADSPERPROC se vynásobí počtem procesorů v počítači, aby se získal celkový počet vláken. Výchozí hodnota je 2 vlákna na procesor. V případě potřeby můžete před zahrnutím hodnoty atlutil.h definovat pro tento symbol vlastní kladnou celočíselnou hodnotu.

dwStackSize
Velikost zásobníku pro každé vlákno ve fondu.

hCompletion
Popisovač objektu, který se má přidružit k portu dokončení.

Návratová hodnota

Vrátí S_OK při úspěchu nebo chybu HRESULT při selhání.

CThreadPool::QueryInterface

Provádění .IUnknown::QueryInterface

HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppv) throw();

Poznámky

Objekty této třídy lze úspěšně dotazovat na IUnknown rozhraní a IThreadPoolConfig .

CThreadPool::QueueRequest

Voláním této metody zařadíte pracovní položku do fronty, kterou bude zpracovávat vlákno ve fondu.

BOOL QueueRequest(Worker::RequestType request) throw();

Parametry

prosba
Požadavek, který se má zařadit do fronty

Návratová hodnota

Vrátí hodnotu PRAVDA při úspěchu, NEPRAVDA při selhání.

Poznámky

Tato metoda přidá pracovní položku do fronty. Vlákna ve fondu vyberou položky z fronty v pořadí, ve kterém jsou přijaty.

CThreadPool::Release

Provádění .IUnknown::Release

ULONG STDMETHODCALLTYPE Release() throw();

Návratová hodnota

Vždy vrátí hodnotu 1.

Poznámky

Tato třída neimplementuje řízení životnosti pomocí počítání odkazů.

CThreadPool::SetSize

Voláním této metody nastavíte počet vláken ve fondu.

HRESULT STDMETHODCALLTYPE SetSizeint nNumThreads) throw();

Parametry

nNumThreads
Požadovaný počet vláken ve fondu.

Pokud je argument nNumThreads záporný, jeho absolutní hodnota se vynásobí počtem procesorů v počítači, aby se získal celkový počet vláken.

Pokud je nNumThreads nula, ATLS_DEFAULT_THREADSPERPROC se vynásobí počtem procesorů v počítači, aby se získal celkový počet vláken. Výchozí hodnota je 2 vlákna na procesor. V případě potřeby můžete před zahrnutím hodnoty atlutil.h definovat pro tento symbol vlastní kladnou celočíselnou hodnotu.

Návratová hodnota

Vrátí S_OK při úspěchu nebo chybu HRESULT při selhání.

Poznámky

Pokud je zadaný počet vláken menší než počet vláken aktuálně ve fondu, objekt umístí zprávu o vypnutí do fronty, která se má vyzvednout čekacím vláknem. Když čekající vlákno přetáhne zprávu z fronty, upozorní fond vláken a ukončí proceduru vlákna. Tento proces se opakuje, dokud počet vláken ve fondu nedosáhne zadaného čísla nebo dokud žádné vlákno neukončí v období určeném funkcí GetTimeout SetTimeout/ . V takovém případě metoda vrátí HRESULT odpovídající WAIT_TIMEOUT a čekající vypnutí zprávy je zrušena.

CThreadPool::SetTimeout

Voláním této metody nastavíte maximální dobu v milisekundách, po kterou bude fond vláken čekat, až se vlákno vypne.

HRESULT STDMETHODCALLTYPE SetTimeout(DWORD dwMaxWait) throw();

Parametry

dwMaxWait
Požadovaná maximální doba v milisekundách, po kterou fond vláken počká, až se vlákno vypne.

Návratová hodnota

Vrátí S_OK při úspěchu nebo chybu HRESULT při selhání.

Poznámky

Časový limit se inicializuje na ATLS_DEFAULT_THREADPOOLSHUTDOWNTIMEOUT. Výchozí čas je 36 sekund. V případě potřeby můžete před zahrnutím hodnoty atlutil.h definovat pro tento symbol vlastní kladnou celočíselnou hodnotu.

Všimněte si, že dwMaxWait je čas, kdy fond bude čekat na vypnutí jednoho vlákna. Maximální doba potřebná k odebrání více vláken z fondu může být o něco menší než dwMaxWait vynásobená počtem vláken.

CThreadPool::Shutdown

Voláním této metody ukončete fond vláken.

void Shutdown(DWORD dwMaxWait = 0) throw();

Parametry

dwMaxWait
Požadovaná maximální doba v milisekundách, po kterou fond vláken počká, až se vlákno vypne. Pokud je zadána hodnota 0 nebo žádná hodnota, tato metoda použije časový limit nastavený CThreadPool ::SetTimeout.

Poznámky

Tato metoda publikuje požadavek na vypnutí do všech vláken ve fondu. Pokud vypršení časového limitu vyprší, tato metoda zavolá TerminateThread na jakémkoli vlákně, které nebylo ukončeno. Tato metoda se volá automaticky z destruktoru třídy.

Viz také

IThreadPoolConfig – rozhraní
DefaultThreadTraits
Třídy