Názory ke článku Vlákna v C# - 1. díl
1. 7. 2008
fajn clanok, pre zaciatocnikov ok (ja uz som u vlakien celkom doma) uz iba ta synchronizacia, niekedy je ako nocna mora :-)
Reagoval na komentář od uživatele mnn : Synchronizace je peklo, to máš pravdu:-) Teorii v dalším díle mám už napsanou, snad to bude dost pochopitelné... tak zase za týden:-)
Zdravím, díky za seriál, je fakt bombově napsanej. Zrovna se mi to hodí do jedný aplikace, ale narazil jsem na jeden problém:
private void button1_Click(object sender, EventArgs e)
{
Thread nove_vlakno = new Thread(test);
nove_vlakno.IsBackground = true;
nove_vlakno.Start();
}
private void test()
{
timer1.Enabled = true;
}
Bohužel timmer se mi zřejmě nikdy nespustí. Funkce test byla trošku naditější, měla toho dělat víc, ale protože nedělala, redukoval jsem její obsah až na tohle a zde je chyba. Prosím nevíte někdo, co s tím? Díky Ondra
Reagoval na komentář od uživatele Ondřej Karas : C# má tři Timery - jeden z namespace System.Windows.Forms, druhý ze System.Threading a třetí ze System.Timers.Timer. Pokud jsi Timer přetahoval do aplikace z Toolboxu, použil se ten z Windows.Forms namespace, ale pro práci s vlákny potřebuješ ten ze System.Threading (nebo i ten z System.Timers to zvládne). Víc informací najdeš na googlu, základní porovnání co dovedou tady http://mark.michaelis.net/Blog/SystemWindowsFormsTimerVsSystemThreadingTimerVsSystemTimersTimer.aspx. Vidíš to, tohle vůbec není špatný námět na článek:-) Doufám, že ten tvůj problém je způsobený tímhle, ale řekl bych, že jo.
Reagoval na komentář od uživatele Jakub Kottnauer :
Díky na porovnání se podívám a zkusím to. Jde o to, že aplikace kterou dělám by měla odeslat po sériový lince zprávu a pak čekat dokud nepříjde odpověd, zkontrolovat ji a pak se dál zařídit. V případě že nepříjde potom se podle toho zařídit. Vzhledem k tomu, že to nějakej čas dá, nechci tím zatěžovat další vlákno. Myslím že zvláštní vlákno by to řešilo... nebo by mohl být nějaký další problém?
Reagoval na komentář od uživatele Ondřej Karas : Přesně na tohle jsou vlákna jako dělaná, řešil bych to taky tak.
Našel jsem si příklad a ten jsem použil, je tam vytvořena třída:
class TimerExampleState
{
public int counter = 0;
public System.Threading.Timer tmr;
}
Já jsem si vytvořil funkci:
static void Spust100msTimmer()
{
TimerExampleState s = new TimerExampleState();
TimerCallback timerDelegate = new TimerCallback(CheckStatus);
System.Threading.Timer timer = new System.Threading.Timer(timerDelegate, s, 100, 0);
s.tmr = timer;
}
a tady je obsluha:
static void CheckStatus(Object state)
{
TimerExampleState s = (TimerExampleState)state;
s.counter++;
s.tmr.Dispose();
s.tmr = null;
}
Vše funguje krásně (k mému překvapení :) ) ale mám problém, že když chci v tý obsluze nastavovat globální bool proměnnou tak mi to hlásí:
Error 2 An object reference is required for the non-static field, method, or property 'Nabijec.Form1.vyprseni_limitu' D:\PROJEKTY\PC programy\NABIJEC\NABIJEC_011\Nabijec\Form1.cs 600 13 Nabijec
Tak si odpovím naštěstí sám, stačí proměnnou nastavit jako static :) Ale díky za tip s tím timerem :) A určitě o tom něco napiš.
15. 7. 2008
super článek, jediný co jsem nenašel v článkách, jako je tenhle, a co bych velmi uvítal, je ovládání FORMů a komponent na nich (např. labelů nebo vykreslování grafu na pozadí aplikace) z jiného než hlavního Threadu. Tušim, že se to dělá nějak přes Invoke či co, ale nikdy se mi nepodařilo to pořádně pochopit...
Díky za případné tipy jednoduchý na pochopení...
Reagoval na komentář od uživatele supec : Neboj, i na to jednou dojde:-) Ještě budou dva, tři díly o něčem jiném ohledně vláken a pak bude Invoke
15. 7. 2008
Reagoval na komentář od uživatele Jakub Kottnauer :
tak to už se těšim, dík...
Reagoval na komentář od uživatele supec : Trochu to upřesním, teď už přesně vím, kdy o Invoke budu psát - bude to v 7. díle (tam to spíš jen naťuknu, než o tom budu nějak sáhodlouze mluvit) a pak až v 10. díle, který bude o asynchronních delegátech. Nebudu o tom psát zvlášť, protože to zase tak velká kapitola není a v obou těch dílech bude souviset s jinou problematikou, takže kvůli tomu to bude takhle rozdělené. Momentálně píšu 6. díl, takže tohle je 100% jistá informace. Počkáte si trochu déle, ale dočkáte se:)
Mám už i hrubou představu, kolik dílů bude seriál mít - 14 až 16:-)
11. 10. 2008
Chytat všechny výjimky je nesmysl, minimálně by tam měl být zvlášť catch pro ThreadAbortException, protože pokud ten thread vytuhne a potřebuješ ho ukončit, zavoláš threadInstance.Abort(), ale v tvém případě to chytne catch třeba někde uvnitř a k ukončení nemusí dojít=to je jeden z důvodů, proč se nadává na chytání obecných výjímek Exception... a to nemusí být samozřejmě jen v hlavní funkci threadu.