Progressbar / thread

Tags:    .net

Hejsa i kloge hoveder derude.

Håber på lidt hjælp til følgende:
Jeg har en klasse, hvori jeg tjekker om en progressbar skal vises og tråden til at styre den startes. Problemet er at min klasse ikke kan "se" progressbaren på formen - og jeg kan ikke flytte koden over på formen, for så ved jeg ikke om den skal startes... What to do?
Jeg ville gerne have følgende liggende i min kaldende klasse...

public void progressbarStart()
{
for (int i = 0; i < 100; i++)
{
Thread.Sleep(100);
progressbar.Increment(1);
}
}
Jeg har forsøgt at lægge al koden direkte på formen - men så oplever jeg følgende.
Jeg har sat visible = false på formen (den skal kun vises, når tråden kører, men når jeg så prøver at køre programmet, så får jeg denne fejl, selvom det er det eneste sted jeg laver noget på progressbaren.
"Handling på tværs af tråde er ugyldig: Objektet 'Form' blev åbnet fra en anden tråd end den tråd, det blev oprettet i."

Håber på hjælp - og takker på forhånd!
Katrine.



Skylder måske at sige at jeg koder i C# - har lige opdaget, at jeg så kunne lægge spørgsmålet et andet sted... Beklager, men jeg er ny på siden. ;-)



Jeg har tidligere brugt et Singleton pattern til at få adgang til en form fra en anden tråd.

Du kan prøve at kigge her: http://en.wikipedia.org/wiki/Singleton_pattern

Der er et eksempel under C# længere nede i artiklen.

Jeg ved ikke om det er den mest "rigtige" metode, men den virker.

Mvh Martin



Du har et cross thread operation problem. Jeg kunne godt forklare, hvad der er, men det er nemmere at lade andre gøre det. ;)

http://kristofverbiest.blogspot.com/2007/02/simple-pattern-to-invoke-gui-from.html

Ellers Google cross thread operation, du er ikke den første, der har haft problemet.



Hvis du laver et singleton pattern i stil med dette:

Fold kodeboks ind/udCSharp kode 


Så kan du gøre følgende for at fange din form
Fold kodeboks ind/udCSharp kode 


Så kan du fange din progressBar på følgende måde

instance.progressBar.increment(1)



Nu påstår Martin, at man kan løse dit problem med Singleton. Det er ikke tilfældet. Singleton kan bruges til at få adgang til din Form klasse fra en ny klasse, men det kan ikke løse dit cross thread problem.

Hvis du har følgende kode i din form klasse

Fold kodeboks ind/udCSharp kode 


Og ændrer din klasse indeholdende din Main metode

Fold kodeboks ind/udCSharp kode 


Så kan du flytte din ProgressbarStart metode til en anden klasse, men den vil stadig have adgang til Form klassen via Singleton.



Indlæg senest redigeret d. 02.01.2009 20:34 af Bruger #13106
I stedet for og gøre det så kompliceret hvorfor opretter du så ikke en funktion der hedder progressbarInc i din form der gør:
progressbar.Increment(1);

Og i din klasse med threading så siger du bare
formHalløj.progressbarInc();

(Husk og gør din funktion static hvis det er :P)



I stedet for og gøre det så kompliceret hvorfor opretter du så ikke en funktion der hedder progressbarInc i din form der gør:
progressbar.Increment(1);

Og i din klasse med threading så siger du bare
formHalløj.progressbarInc();

(Husk og gør din funktion static hvis det er :P)


Man kan ikke tilgå en non-static progressbar via en static metode.

Derudover bliver Katrines oprindelige problem ikke løst. Du kan ikke bare tilgå GUI trådens controls fra en anden tråd. Det er GUI tråden, der bestemmer, hvornår de forskellige controls kan opdateres.



t