1) Jal jsem psal, jde o příklad jak, navíc v MessageBoxem jsem tabulky nikdy nezkoušel vypsat.
2) Psal jsem, že je to něco jako ErrorProvider, což je child okno, kde se vypíše nějaký seznam událostí. Je to komponenta, tedy něco co se dá použít na libovolném místě, není to samotný program, spíš něco co bude v nějaké knihovně, kterou program použije. Nikde jsem nepsal o vytváření formulářů mimo designer, opět jako ErrorProvider, se při použití zadá nějaký control z libovolného UI a v nějakém odstupu od něj se do tohoto UI doplní PictureBox (tento jeden si to tedy vytvoří samo mimo designer), který se v případě, že je v zapsána nějaká událost zobrazí.
Uživatel této třídy (formu) nemusí používat přímo vlákna, klidně může používat pohodlnější tasky.
Neprováděj jsem nějaký sofistikovaný dlouhodobý test, ale za pomocí dvou různých locků to nyní funguje, ale není to moc pěkné, takže řeším jestli to jde líp.
Co je na locku špatného?
Stejně tak co je špatného na těch starých formulářích? Co jsem koukal na zdrojové soubory technologie, které je za mě napsána dost dobře, tedy od základu v C++ pro jednotlivé typy procesorů, s podporou více vláken a až vyšší objekty v C#, tak forms tam mají také ty staré (jen používají dědičnost). Je to soft co pracuje s 3D grafikou, takže spousta komplikovaných výpočtů. Možná to jen vyvíjejí delší dobu (každý měsíc několik updatů) a staré věci se jim nechce přepisovat, kdo ví.
Požití Sleepu mi přijde nesmyslné, tím nejde na nic čekat, nevím přeci jestli operace bude trvat 10ns, nebo 1s, od toho jsem tam ty locky, že to čeká tak dlouho, dokud se neuvolní.
Je to teprve druhá věc co jsem s vlákny kdy dělal a v práci to ani nepotřebuju, spíš zvídavost. Prvně jsem zkoušel obecnou třídu pro výpočty pomocí vláken. Třída má svůj zásobník akcí a postupně je umisťuje podle priorit na vlákna tak, aby byla stále vytížená a tam to invokuje akce ze zásobníku. Co jsem zkoušel udělat pomocí toho pro kontrolu třeba HeapSort, tak to má i na milionech prvků stejný výsledek, jako řazení co je ve frameworku. Požívá to také jen locky a ManualResetEventy
3) Dělam si to složitý, ale bojuju s tím :) Cože oni se prací dají peníze i vydělat, já jim za to ještě platím :)
Co o tom vím, tak system ma svůj ThreadPool, pokud se používají Tasky, tak na to systém použije vlákno odsud, pokud tam není, tak vytvoří nové. Pokud si program vytvoří svá vlákna, tak jsou mimo, ale asi by tam šla dát, nikdy jsem to nepotřeboval. Na počtu vláken moc nezáleží, běžně ve windows běží mnohem větší počet vláken než kolik vláken má procesor a systém si sám řídí, jaké vlákno kdy obslouží, částečně to jde snad ovlivnit nastavenou prioritou vlákna. Pro jistotu jsem ale dělal o jedno vlákno méně než kolik jich procesor má.