Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Dog
Člen
Avatar
Dog:5.8.2016 22:02

Čaues, musel jsem přeprogramovat svůj software, protože lagoval form1, při (150x zacyklenym) Thread.Sleep(20), tak jsem to přeprogramoval a dal to zacyklení s sleep do druhého vlákno a dělá to stále to stejné, buttony reagují s dvou vteřinovým zpožděním..

Form1:

private void timer1_Tick(object sender, EventArgs e)
{

    analyze_logs ps = new analyze_logs();
    Task task = new Task (ps.psanalyze);

    task.RunSynchronously();
    task.Wait();

    listBox1.Items.Add(analyze_logs.x);

    gto Cards = ps.Cards;

    if (Cards != null)
    {
        try
        {

ve třídě analyze_logs psanalyze:

if (ok == false)
{
    Thread.Sleep(20);
    tiktak++;
}
 
Odpovědět
5.8.2016 22:02
Avatar
vesel.fil
Člen
Avatar
vesel.fil:6.8.2016 8:59

Protože to voláš synchronně. Místo RunSynchronously použij Run.

https://msdn.microsoft.com/…ks.task.aspx

Editováno 6.8.2016 9:00
Nahoru Odpovědět
6.8.2016 8:59
I don't necessarily agree with everything I say.
Avatar
Dog
Člen
Avatar
Dog:6.8.2016 11:40

funkce psanalyze vyhledává v textu, když už není žádnej text tak se zacyklí a čeká neustále na další text.

Tak při použití tohoto kódu se po načtení všech dat co mám v PC už nedá Form1 ovládat. Předtím reagovala alespoň po 2-3 sekundách. Tak nevím vážně jak to udělat :(

var /*( i task)*/ t = Task.Run(() => { ps.psanalyze(); });
    t.Wait();
Editováno 6.8.2016 11:41
 
Nahoru Odpovědět
6.8.2016 11:40
Avatar
Odpovídá na Dog
sadlomaslox25:6.8.2016 15:02
private async void timer1_Tick(object sender, EventArgs e)
await Task.Run(() => { ps.psanalyze(); });

precti si nejaky tutorial o vlaknech

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
6.8.2016 15:02
Avatar
Dog
Člen
Avatar
Dog:6.8.2016 20:07

no, funguje to, ale problém je právě v tom, že to nečeká, až doběhne ps.psanalyze(); Projel jsem si všechny články v threadingu a zitra budu muset ještě všechny premiovy v objektech, protože mi spousta věcí momentálně nedává smysl.

Takže bych potřeboval, aby to čekalo na dokončení ps.psanalyze();,,a­le ano form se už nezasekne :)

Editováno 6.8.2016 20:08
 
Nahoru Odpovědět
6.8.2016 20:07
Avatar
VitekST
Člen
Avatar
Odpovídá na Dog
VitekST:7.8.2016 9:05

Udělej si callback, který se zavolá až to úloha hotová.

Protože v ten moment, jakmile budeš z hlavního vlákna čekat na vlákno, kde probíhá úloha, zablokuješ si message loop a hlavní formulář ti nebude reagovat.

To stejné se stalo i v prvním případě, kdy si úlohu spouštěl v hlavním vlákně.

 
Nahoru Odpovědět
7.8.2016 9:05
Avatar
Dog
Člen
Avatar
Dog:8.8.2016 1:36

Mohl by si to prosím trošku přiblížit? :) Díky moc...

 
Nahoru Odpovědět
8.8.2016 1:36
Avatar
VitekST
Člen
Avatar
Odpovídá na Dog
VitekST:8.8.2016 13:32

Použij prosím pro příště tlačítko "Odpovědět", nikdo totiž nemůže vědět, že na komentář někdo odpovídá.

No, callback, zpětné zavolání.
Ty nemůžeš čekat na dokončení činnosti v jiném vlákně, co ale můžeš udělat, je že vlákno (jakmile se vše dokončí) spustí kód, kterým se ve formuláři pokračuje dále (callback).

Příklad:

void StartAction(){ //Spustí asynchronní úlohu (v novém vlákně)
        Thread t = new Thread(new ThreadStart( () => { //Lambda výraz, předáme do konstruktoru třídy ThreadStart novou anonymní metodu

                DoSomething(); //Nějaká činnost, co trvá stráááášně dlouho
                StartAction_callback(); //Voláme callback, jakmile je vše hotovo
        }));
}

void StartAction_callback(){ //Callback
        this.Invoke(new Action( () => { //DŮLEŽITÉ: Nemůžeš s prvky manipulovat z jiného vlákna; musíš kód spustit v rámci vlákna, kde se nachází formulář (this = Form)

                lbl_Status.Text = "Hotovo"; //Tady si již dělej co chceš
        }));
}
Editováno 8.8.2016 13:33
 
Nahoru Odpovědět
8.8.2016 13:32
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.