V tomto článku ukážu snadný způsob, jak využívat více vláken v aplikaci.

 

Úvod

Vícevláknovost, neboli multithreading zvyšuje výkonnost aplikace. V jednom procesu aplikace může být i několik paralelně běžících vláken v jeden okamžik a systém souměrně rozděluje prostředky (výkon) všem vláknům, a to bez ohledu na složitost operace. Zkráceně: během toho, kdy jedno vlákno stojí (při složitém výpočtu), druhé vlákno stále běží.

 

Co je potřeba?

  • Základní znalost programovaní v jazyce C/C++.
  • Vhodný kompilátor (nejlépe vývojové prostředí MS Visual Studio).
  • Knihovny: windows.h  stdio.h

Vytvoření vlákna a uvedení do provozu

#include <Windows.h>
#include <stdio.h>

DWORD WINAPI VlaknoJedna(void*);
DWORD WINAPI VlaknoDva(void*);

Includujeme knihovny a deklarujeme handlery na naše dvě vlákna. Stejný způsob jako při deklaraci nové funkce.

 

int main(int argc, char** argv)
{
    HANDLE hndl_jedna = CreateThread( NULL, NULL, &VlaknoJedna, (void*)11 , 0, 0 );
    HANDLE hndl_dva   = CreateThread( NULL, NULL, &VlaknoDva, (void*)22 , CREATE_SUSPENDED, 0 );

Nyní vytvoříme naše nová vlákna při startu aplikace.

Do vyvolávací funkce CreateThread() zadáváme 6 parametrů.
Funkce nám vrací HANDLE vytvořeného vlákna. Ten pak uložíme do pointeru hndl_jedna / hndl_dva.

První parametr je zabezpečovací. V našem případě použijeme NULL.
Druhým parametrem určíme velikost zásobníku vlákna. Použitím NULL nastavíme výchozí velikost hlavního, primárního vlákna.
Třetí parametr slouží pro pointer naší funkce, která pak vykonává práci vlákna.
Čtvrtý parametr je k předání parametru do funkce vlákna.
Pátý parametr určí, kdy bude vlákno spuštěno. Zadáním 0 se vlákno spustí hned po vytvoření. Zadáním definice CREATE_SUSPENDED se vlákno spustí až po zavolání funkce ResumeThread(), kde do parametru zadáme handle vytvořeného vlákna.
Poslední, šestý parametr vrací ID vlákna do zadaného pointeru.

 

    ResumeThread( hndl_dva );          // Spustíme vlákno
    while(true)                        // Opakujeme do nekonečna
    {
        Sleep( 1000 );                 // Každý cyklus pozastavíme na 1 sekundu
        printf("Primarni vlakno.\n");  // Vypíšeme do konzole vykonání jednoho cyklu
    }
    return 0;
}

Funkci ResumeThread() jsem už zmínil.

 

DWORD WINAPI VlaknoJedna(void* lp)
{
    while(true)
    {
        Sleep( 100 );
        printf("Vlakno jedna. %d\n", lp);
    }
    return 0;
}

DWORD WINAPI VlaknoDva(void* lp)
{
    while(true)
    {
        Sleep( 5000 );
        printf("Vlakno dva. %d\n", lp);
    }
    return 0;
}

Vytvoříme dvě funkce, které budou vykonány v nových vláknech.

U obou z nich nastavíme do cyklu pozastavení procesu funkcí Sleep() a stejně jako u primárního vlákna budeme vypisovat do konzole informaci, kdy dojde k vykonání cyklu po uplynutí pozastavení.

Returnem ve funkci vlákna její činnost ukončíme.

Komentáře  

 
0 # ejivuxaij 2021-08-14 11:08
http://slkjfdf.net/ - Ijohiix Zazkomu qzh.isdp.joudov e.8u.cz.cko.wo http://slkjfdf.net/
Odpovědět | Odpovědět citací | Citovat