Multithread a progressbar – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Multithread a progressbar – .NET – Fórum – Programujte.comMultithread a progressbar – .NET – Fórum – Programujte.com

 

aerkain0
Newbie
10. 2. 2008   #1
-
0
-

- 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?

Nahlásit jako SPAM
IP: 195.113.99.–
durmitor
~ Redaktor
0
Věrný člen
10. 2. 2008   #2
-
0
-

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));

Nahlásit jako SPAM
IP: 77.236.208.–
Nejhorší není nemít práci. Nejhorší je nechtít práci...
aerkain0
Newbie
11. 2. 2008   #3
-
0
-

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.

Nahlásit jako SPAM
IP: 195.113.99.–
Jura
~ Anonymní uživatel
637 příspěvků
11. 2. 2008   #4
-
0
-

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

Nahlásit jako SPAM
IP: 85.207.192.–
Jura
~ Anonymní uživatel
637 příspěvků
11. 2. 2008   #5
-
0
-

Kuwa, oprava:
že k tomu progressbarupřistupuješ přes vlákno, které jej vytvořilo??

Nahlásit jako SPAM
IP: 85.207.192.–
aerkain0
Newbie
11. 2. 2008   #6
-
0
-

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.

Nahlásit jako SPAM
IP: 195.178.89.–
12. 2. 2008   #7
-
0
-

To aerkain : A co Background Worker? Event ProgressChanged pro update progressbaru a event RunWorkerCompleted pro vypsani vystupnich hodnot po ukonceni...

Nahlásit jako SPAM
IP: 194.213.32.–
aerkain0
Newbie
13. 2. 2008   #8
-
0
-

to byhc musel zapsat do te třídy A - což nechci - už to mam hotove. Přes asynchronní delegaty.

Nahlásit jako SPAM
IP: 195.178.89.–
Daniel.Pospisil
~ Anonymní uživatel
1 příspěvek
13. 2. 2008   #9
-
0
-

To aerkain : jj taky reseni.. BTW jinak nevidim duvod proc bys musel pri pouziti BW menit tu tridu ale to je uz zrejme jedno..

Nahlásit jako SPAM
IP: 194.213.32.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 13 hostů

Podobná vlákna

ProgressBar — založil Frank

ProgressBar — založil Anderos

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý