- Mam třídu (A) ve které mám náročný proces (procA).
- Tato třída vystavuje veřejnou vlastnost, která indikuje stav výpočtu náročného procesu (progressValue).
V druhé třídě si vytvořím instanci a nechám pracovat ten náročný proces (procA).
Chci si zobrazovat průběh výpočtu v progressbaru.
Myslel jsem, že to udělám přes vlákna. Ale když dam v druhé třídě (B) jedno vlákno na spuštění toho procesu (procA) a druhé vlákno na zvyšování hodnoty progressbaru, tak mi to háže chybu v tom, že nelze přistupovat k vlastnosti, kterou vlastní jiný proces.
Vlakno1->a.procA
Vlakno2->progressbar.Value = a.progressValue; <= exception
->Thread.Sleep(1000) //toto chci aby zajistilo že se mi progres bar budu aktualizovat každou sekundu.
Takže jak přistupovat k vlastnosti, se kterou právě pracuje jiný proces?
Fórum › .NET
Multithread a progressbar
Já to dělám na příklad takle, neříkám že je to dobře, ale funguje :-)
Udělám si funkci, která mi skrije animovátko :-D
private void StopAnimation(object s, EventArgs e)
{
pictureBox1.Visible = false;
}
a tam kde potřebuju to použít napíšu:
this.BeginInvoke(new EventHandler(StopAnimation));
No ja to tak nemůžu asi udělat. Jestli to chapu spravně, tak bych musel zavolat BeginInvoke z instace třídy A, ale tu třidu nechci/nemůžu upravovat.
Prostě to potřebuju nějak udělat přes tu veřejnou vlastnost progressValue. Ale k ní nemůžu přistupovat.
Zdravím,
abych se přiznal v C# moc nedělám, prakticky vůbec, nicméně jsi si jistý, že k tomu přistupuješ přes vlákno, které jej vytvořilo??
Jinak koukni na tenhle odkaz,mohlo by to být to, co hledáš: http://www.codeproject.com/KB/cs/workerthread.aspx
Už jsem na to vice-mene přišel. Problém byl, že jsem se snažil updatovat GUI z vlákna té náročné operace. Mam to ted dělané přes event zmeny hodnoty progressValue, takže jsem to musel udělat přes progressbar1.dispatcher.BeginInvoke(..) (v eventhandleru OnProgressValueChange).
Ted spiš řeším jak udělat to, že jakmile mi skončí výpočet toho vlákna, tak vypíšu hodnoty z té instance (a) do GUI. Ale už to nechci vypisovat přes vypočtové vlákno, ale přímo v GUI vláknu . Když bych udělal event signalizující ukončení operace, tak se mi ten handler zase pusti v tom početním vlákně :(.
Jak pustit ten event Handler na událost "ukončen náročný vypočet" ve vlákně GUI?
Jsem spiš čekal, že nějak navážu to ukončení vlákna s metodou (na GUI vlákně), která mi v GUI nastavi výstupní hodnoty, které si přečtu z vlastnosti instance třídy A. Ale hlavně jsem čekal, že se mi zpracování eventu pustí v GUI vlákně :(. Mam v tom ještě furt zmatek.
To aerkain : A co Background Worker? Event ProgressChanged pro update progressbaru a event RunWorkerCompleted pro vypsani vystupnich hodnot po ukonceni...
To aerkain : jj taky reseni.. BTW jinak nevidim duvod proc bys musel pri pouziti BW menit tu tridu ale to je uz zrejme jedno..
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
ProgressBar — založil Frank
ProgressBar — založil Anderos
"Kulatý" progressbar - winapi — založil ProXicT
C# Progressbar fungující i pod zatížením — založil Attila
Silverlight - dataBinding z kódu - ProgressBar — založil Petrroll
Moderátoři diskuze