Avatar billede acore Ekspert
25. november 2010 - 10:39 Der er 11 kommentarer og
1 løsning

Løbende pdatering af textfelt

Jeg er i gang med mit første C# program, oghar allerede fået godt hjælp herinde :)

Jeg har en toolstrip med en progressbar og en label.

Progressbar'en skal vise progress og label'en skal vise hvilket fil, der processeres.

Mit problem er, at selv om jeg ændrer indholdet af label'en, så opdateres skærmen ikke før koden er færdig med at køre, hvilket ikke duer her.

Hvad kan jeg gøre, for at label'ens indhold på skærmen opdateres straks det ændres?
Avatar billede 2Mida Praktikant
25. november 2010 - 11:01 #1
Kan DoEvents() bruges i løkken?
Avatar billede acore Ekspert
25. november 2010 - 11:10 #2
Ja, fandt også lige selv ud af det.

Application.DoEvents();

løser problemet. Smid et svar
Avatar billede Syska Mester
25. november 2010 - 11:12 #3
Logisk set vil det ikke virke, da du kun har en tråd ... når du så sætter den til at lave noget andet, så opdateret UI ik.

Der er mange løsninger på det. Kører jobet tæt på UI, kan du som 2Mida skriver, bruge DoEvents, det gør at der bliver givet noget tid til UI'en for at den kan opdatere.

Alternativt er at starte en ny tråd ... og køre dit job i den, så du ikke belaster UI tråden. Vær dog opmærksom på Cross Thread Violation. Søg efter det herinde, da det har været oppe at vende 1000 gange før hvordan du opdatere UI fra en anden tråd.

mvh
Avatar billede acore Ekspert
25. november 2010 - 11:23 #4
Tak til buyzzzz også.

Jeg vil lige afprøve det i den virkelige applikation. Hvis doevents virker, er der vel ingen grund til at lave en ny tråd? I modsat fald vil jeg prøve at blive klogere på tråde.
Avatar billede 2Mida Praktikant
25. november 2010 - 11:26 #5
:-)
Avatar billede arne_v Ekspert
25. november 2010 - 20:42 #6
Jeg vil anbefale en separat tråd og Invoke til at opdatere med.

Prøv og google:
  application doevents evil
Avatar billede acore Ekspert
26. november 2010 - 09:59 #7
@arne_v: Ok - det tager jeg til mig.

Og dog...

Jeg har afprøvet doEvents i applikationen, og det virker - under de betingelser, jeg nu havde.

I forvejen er der en progressbar, der opdateres. Klarer progressbar'en det i en egen thread, eller hvad?

Jeg tænker også: Er det virkelig nødvendigt at lave en thead for at få opdateret én label undervejs - det kan ikke tage mange cpu-kræfter - og c# foregiver at være et højniveau sprog, der selv tager sig af de banale opgaver?

Spørgsmålene mere for at få en bedre forståelse af, hvilke overvejelser, der ligger bag din anbefaling.
Avatar billede arne_v Ekspert
26. november 2010 - 21:18 #8
Det har ikke noget med CPU forbrug at gøre.

Men en hele GUI er frosset indtil en metode der udføres i event tråden er færdig.

Derfor skal der kun udføres timg som går meget hurtigt i event tråden.

Hvis man har noget som tager længere tid (men ikke nødvendigvis CPU tid, fordi det er lige så galt at bare at vente), så bør man starte en separat tråd.

Application DoEvents er et hack. Det virker næsten altid. Men næsten altid er ikke det samme som altid. Google linksene vil fortælle noget om hvorfor.
Avatar billede acore Ekspert
27. november 2010 - 14:40 #9
Mine sidste kommentarer inden jeg lukker:

- doevents virker for mig, og jeg kan leve med "næsten altid" for nu

- buzzzz siger "logisk set vil det ikke virke og arne_v siger "hele GUI er frosset". Det passer ikke - progressbar'en opdateres jo - hvordan den virker ved jeg ikke

Tak for hjælpen til alle...
Avatar billede arne_v Ekspert
27. november 2010 - 23:39 #10
GUI fryser uden brug af DoEvents.

Med DoEvents virker den næsten altid.

Men i de fleste seriøse sammenhænge er "næsten altid" uacceptabelt.
Avatar billede acore Ekspert
28. november 2010 - 15:15 #11
At "GUI fryser uden brug af DoEvents" er ikke helt korrekt. Som jeg har forsøgt at skrive, så opdateres en progressbar mens en label ikke gør.

Lav en form med en label, en prograssbar og en button og læg følgende kode på knappen:

        private void button1_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < 100; i++)
            {
                Thread.Sleep(100);
                label1.Text = Convert.ToString(i);
                progressBar1.Value = i;
            }
        }

Hos mig der opdateres progress baren løbende, men label'en først opdateres, når koden slutter.
Avatar billede Syska Mester
30. november 2010 - 14:04 #12
Har du prøvet at flytte dit vindue rundt mens den opdatere ... ? Det er hvad jeg mener med fryser, og helt sikkert også hvad Arne_v mener.

:-)

Jeg har ingen ide om hvorfor Label ikke opdatere ... men Progess baren gør ... min eneste tanke må være måden den er implementeret på.

mvh
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester