webForumDet fria alternativet

Trådning C#

.NET

1 svar · 529 visningar · startad av jabbalizer

Medlem sedan jan. 2001229 inlägg
Frågan#1

Kan man inte bara starta ett nytt windows forms-projekt i VS.NET 05 och direkt kunna använda sig av flera trådar?

Borde inte MessageBoxen i koden här visas genast, och inte efter att calcPi slutförts?

        delegate void calcPiDelegate(int nr);
        private void button1_Click(object sender, EventArgs e)
        {
            calcPiDelegate d = new calcPiDelegate(calcPi);
            d.BeginInvoke((int)numericUpDown1.Value, null, null);

            MessageBox.Show("kommer inte hit förrän calcPi har slutförts");
        }

Vad måste man mer göra? Hittar inget i boken där exemplet står om att man måste ändra inställningar eller något.

Medlem sedan jan. 2001229 inlägg
#2

Varför besvarar jag alltid mina egna inlägg?!? =)

I alla fall: för er som vill lära av mina dumma misstag så kommer lösningen.

calcPi har en loop som snurrar ugefär 1000 varv för att man ska hinna se vad som händer (då har jag ingen riktig uträkning av siffrorna, utan dummy-värden).

Dessa 1000 varv tar inte många sekunder, men de betyder dock att ett anrop tillbaka till UI-tråden görs 1000 + 1 gånger. Detta för att uppdatera en progressBar i GUIt.

Min slutsats är att så fort jag anropar calcPi, och innan UI-tråden hinner till "MessageBox.show...." så spottar calcPi-tråden ut första eventet som kräver en uppdatering av progressbar. När UI-tråden är färdig med detta så har calcPi producerat minst 1, kanske 1000 nya events som måste processas.

UI-tråden hinner alltså inte gå vidare förrän hela loopen är klar.
Detta fungerar i exempelkoden för att den har en tyngre beräkning av pi, och således hinner man uppdatera processbar innan nästa processbar-event kommer in.

Min lösning: Thread.sleep(100); i calcPi

Men då har jag en annan fundering:
UI-kommer inte processa Paint-event om man kör långa beräkningar direkt i UI-tråden, tydligen för att den först vill ta hand om button_click-eventet, vilket kan ta lång tid om man utför beräkningar. För att slippa en "vit ruta" om man skulle täcka över GUIt å sen visa det igen så kör man ju separata trådar...

Nu till frågan:
Varför processar den eventen som jag nämner ovan innan den slutför button_click-eventet? Är det för att eventen skapats som en konsekvens av knapptryckningen?

Jag förväntar mig egentligen inget svar på detta. Jag bara flummar å skriver vad jag tänker =P

256 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)