Autor Téma: Vlakna dotaz  (Přečteno 1625 krát)

Karlik.M

  • Host
Vlakna dotaz
« kdy: 08-03-2013, 16:15:52 »
Zdravím.
Zkoušim poprve něco s vlany.

Vlakno :=MojejVlakno.Create(True); // vytvořim vlakno
Vlakno.Resume;   // spustim vlakno

Co když chci toto vlakno sustit třeba 100 x

  for i:=0 to 100 do
    begin
           Vlakno :=MojejVlakno.Create(True);
           Vlakno.Resume; 
     end;

Vytvořim takto těch 100 vlaken nebo musim každemu přiřadit nějakou hodnotu




Offline pepak

  • Guru
  • *****
  • Příspěvků: 1493
  • Karma: 37
    • Pepak.net
Re:Vlakna dotaz
« Odpověď #1 kdy: 08-03-2013, 16:42:02 »
Co když chci toto Vytvořim takto těch 100 vlaken nebo musim každemu přiřadit nějakou hodnotu
Vytvoříš 100 vláken, ale na nejméně 99 z nich ztratíš ukazatel a nebudeš je tedy moci dál řídit (to nemusí vadit) nebo třeba uvolnit z paměti. Přinejmenším bys jim měl nastavit FreeOnTerminate na True, abys nedělal ty leaky.

Karlik.M

  • Host
Re:Vlakna dotaz
« Odpověď #2 kdy: 08-03-2013, 17:25:46 »
A proč spustim jen 1911 vlaken a pak mi to vyhodi okno s hlaškou.
Thread creation error. Ke zpracovaní tohoto přikazu není dostatečny prostor.

Offline Vrtule

  • Mladík
  • **
  • Příspěvků: 54
  • Karma: 10
    • Verze Delphi: XE2
    • Jádro systému Windows
Re:Vlakna dotaz
« Odpověď #3 kdy: 08-03-2013, 17:42:12 »
Zdravím,

problém je pravděpodobně v tom, že byla tvorbou vláken vyčerpána volná virtuální paměť procesu, nebo došlo k vyčerpání fyzické paměti. Tudíž nelze další paměť potřebnou při tvorbě nových vláken alokovat.

Důvody jsou v zásadě dva:
1) vlákna jsou dost složité objekty, které jádro reprezentuje slušně velkými datovými strukturami (kilobajty na jedno vlákno). Používá na to často paměť, která nemůže být uložena do stránkovacího souboru, musí být vždy přítomna v RAM.
2) Při výchozích hodnotách Windows vytváří vlákna se zásobníkem o velikosti 1 MB. Ne že by celá tato oblast byla okamžitě alokovaná, ale minimálně zabírá 1 MB virtuálního adresového prostoru, což je u 32bitových aplikací dost znát. Vytvořením 1911 vláken zaberete skoro 2 GB adresového prostoru a 32bitové aplikace mají ve výchozím nastavení k dispozici právě necelé 2 GB.

Předpokládám, že důvodem té výjimky je právě příčina druhá.

Offline Mi.Chal.

  • Guru
  • *****
  • Příspěvků: 576
  • Karma: 25
Re:Vlakna dotaz
« Odpověď #4 kdy: 08-03-2013, 19:44:48 »
A proč spustim jen 1911 vlaken a pak mi to vyhodi okno s hlaškou.
Thread creation error. Ke zpracovaní tohoto přikazu není dostatečny prostor.

Jenom to zkoušíš nebo to má mít nějaký praktický význam? Pokud by ty thready skutečně něco dělaly, tak se budou spíš brzdit než aby to něčemu pomohlo. Pokud by něco dělaly jednou za čas, tak by bylo lepší použít nějaký jiný způsob - třeba dávat úlohy do fronty a zpracovávat je jenom pár vlákny.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2790
  • Karma: 134
    • Verze Delphi: D2007, XE3, DX10
Re:Vlakna dotaz
« Odpověď #5 kdy: 08-03-2013, 20:21:36 »
Jenom to zkoušíš nebo to má mít nějaký praktický význam? Pokud by ty thready skutečně něco dělaly, tak se budou spíš brzdit než aby to něčemu pomohlo.
Asi zalezi na tom, co delas. Ja jsem kdysi psal v Delphi crowler, u kteryho jsem na zaklade propustnosti zvedal/snizoval pocet threadu a jestli si to pamatuju, tak jsem nejvetsi propustnosti dlouhodobe dosahoval mezi 1200-1300 thready. Ale zapisy do DB jsem nedelal z tech threadu, ty davaly vystupy jen do FIFO.

A mam dojem, ze max. pocet threadu, ktere se daly vytvorit, byl nekde pod 1900 a  pricinou byl nedostatek pameti pro stack.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2611
  • Karma: 103
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Vlakna dotaz
« Odpověď #6 kdy: 09-03-2013, 00:12:39 »
A mam dojem, ze max. pocet threadu, ktere se daly vytvorit, byl nekde pod 1900 a  pricinou byl nedostatek pameti pro stack.

Nedávno jsem četl http://www.deltics.co.nz/blog/?p=1330, kde se dostal na přes 6000.
Embarcadero MVP - Czech republic