Dödsklocka i C#, problem med textbox.Text

Permalänk

Dödsklocka i C#, problem med textbox.Text

Skolprojekt där en del i projektet är att skapa en räknare som visuellt hur dödsfallen i andra världskriget ökar med åren.

Jag har fått detta att fungera i en ConsoleApplikation, men när stoppar in koden för att visa via Windows Forms når jag inte önskat resultat.

Jag provat med både en label och en textbox

Värdet "antal" som successivt ökas och borde skrivas ut en gång per varv i loopen presenteras bara efter att "antal" nått önskat värde.

Citat:

void funktion(int temp)
{
forandring = 50000;
while (antal > temp)
{
Thread.Sleep(100);
antal = antal - forandring;
lblrakna.Text = antal.ToString();
}

while (antal < temp)
{
Thread.Sleep(100);
antal = antal + forandring;
lblrakna.Text = antal.ToString();
}

Visa signatur

Macbook pro 13", 4gb ddr3, core2duo 2,53ghz, nvidia 9400m

Permalänk

Det är inget fel på koden som så, det är bara så ramverket fungerar. GUI-trådens visuella representation uppdateras bara en gång oberoende av hur mycket data du skyfflar till den, och det är när den är klar och väntar på input.

http://stackoverflow.com/questions/661561/how-to-update-gui-f... eller googla på t ex BeginInvoke.

Visa signatur

www.uu.se - some kind of university | www.hirr.org.uk - ain't no mountain high enough | www.bajenfans.se

Permalänk
Medlem

För att dynamiskt förändra en labels innehåll så behöver du använda tex ajax.

Kolla in UpdatePanels i VS.

Visa signatur

...

Permalänk
Medlem

Men gud vad hemskt. Är detta vad man får lära sig som student idag? På min tid skrev vi "Hello, World!" till terminalfönster.

Skämt åsido, jag har inte programmerat något C# innan men testa att göra en form.Update() efter varje sleep och se om det fungerar.

Visa signatur

Kom-pa-TI-bilitet

Permalänk

han skriver ju windows forms? Ajax hör inte hit.

Du kommer nog att få problem med att du sleepar din huvudtråd förutsatt att du inte har skapat en workertråd. Att använda en timer här skulle nog göra att det fungerar, vilket även gör att du slipper de problem som uppstår när du gör en applikation multitrådad(om du nu inte är sugen på att lära dig det).

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av KurreKula
han skriver ju windows forms? Ajax hör inte hit.

Du kommer nog att få problem med att du sleepar din huvudtråd förutsatt att du inte har skapat en workertråd. Att använda en timer här skulle nog göra att det fungerar, vilket även gör att du slipper de problem som uppstår när du gör en applikation multitrådad(om du nu inte är sugen på att lära dig det).

Jag håller med om att det är bättre att skapa en ny tråd för allt som inte är GUI-relaterat. För mig personligen har en backgroundworker löst mina problem.

Hittade följande tutorial om just backgroundworker i C#:
http://www.dreamincode.net/forums/showtopic112547.htm

Visa signatur

data, representation av värden, text etc. lämpad för överföring, tolkning eller bearbetning av människor eller maskiner.
dator, digital automatisk beräkningsmaskin som styrs av ett i dess minne lagrat program.

Permalänk

Hallå och tack för alla svar, det visade sig vara så pass enkelt som att lägga till

Application.DoEvents();

Nu fungerar det utmärkt.

Nästa problem blir att anpassa hastigheten med vilken Antalet förändras med, d.v.s. få den dynamisk!

Har en idé som jag tror borde fungera.

Visa signatur

Macbook pro 13", 4gb ddr3, core2duo 2,53ghz, nvidia 9400m

Permalänk
Citat:

Ursprungligen inskrivet av Torkelboy
Hallå och tack för alla svar, det visade sig vara så pass enkelt som att lägga till

Application.DoEvents();

Nu fungerar det utmärkt.

Nästa problem blir att anpassa hastigheten med vilken Antalet förändras med, d.v.s. få den dynamisk!

Har en idé som jag tror borde fungera.

Du bör titta på en timer eller tråd innan du fortsätter. Blir det inte så att ditt program hänger sig med 100ms hela tiden?

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Citat:

Ursprungligen inskrivet av KurreKula
Du bör titta på en timer eller tråd innan du fortsätter. Blir det inte så att ditt program hänger sig med 100ms hela tiden?

Det är det som är poängen, man skall hinna se hur räknaren räknar

Sedan har jag en förändringsfaktor som skall anpassas till hur stort avståndet är till måltalet.

Visa signatur

Macbook pro 13", 4gb ddr3, core2duo 2,53ghz, nvidia 9400m

Permalänk
Hedersmedlem
Citat:

Ursprungligen inskrivet av Torkelboy
Nu fungerar det utmärkt.

Som sagt fungerar det nog inte alls riktigt så bra som du vill. Testa till exempel att dra ett annat fönster över programmet medan det kör (ok, om man endast sover i 100 ms kanske det inte märks så mycket, men det är ändå ingen särskilt bra metod). Tänk på att det är spöstraff på att sova i guitråden.

Citat:

Ursprungligen inskrivet av Torkelboy
Det är det som är poängen, man skall hinna se hur räknaren räknar

Det du vill är att den helt enkelt inte skall räkna upp för fort, inte att guiuppdateringen (uppritning av fönster, fokusförändringar, grafiska effekter på knappar och liknande) skall avbrytas under tiden.

Permalänk

Jag förstår vad ni menar, och inser att det kan bli problematiskt! Har som ni nog redan listat ut inte någon kunskap om multitrådning.

Det slutgiltiga programmet skall vara utformat på följande sätt.

En interaktiv tidlinje som löper mellan 39 och 45, du väljer år och fårinformation om krigets händelser i form av animationer och till viss del bild och text.

Räknaren som jag håller på med skall efter att man klickat på aktuellt årtal räkna till aktuell siffra för dödsoffer. Detta skall då ske simultant med eventuella animationer.

Vilka är mina val?
Och åter igen, tack för bra och snabba svar!

Visa signatur

Macbook pro 13", 4gb ddr3, core2duo 2,53ghz, nvidia 9400m

Permalänk

http://msdn.microsoft.com/en-us/library/system.timers.timer.a...

Kolla på det objektet där du använder dig av ett event som skapas med det interval du vill. Fördelen här är att du slipper använda dig av invoke och delegates för att det ska fungera.

Nackdelen är att du inte kan använda det upplägget du har med en while loop, men det borde du lätt kunna lösa genom att stoppa timern vid en ifsats

annars kan du titta på multitrådning:
http://msdn.microsoft.com/en-us/library/ms173178.aspx

Roligt men lite krångligare. Du får ha en separat tråd som jobbar med det du vill, den i sin tur kan du sleepa hur mycket du vill och det påverkar inte ditt program så att det märks genom att det låser sig. Dock kan du itne hämta och ändra värden på kontroller från andra trådar lätt utan måste då använda dig av funktioner, delegates och invokes Det är ett virrvarr det där med trådat men det är väldigt användbart och något man kommer att behöva lära sig i slutändan!

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk

Okok, jag vet att det kommer kurser i parallella system och annat längre fram i utbildningen(läser första terminen av 6).

Låt oss säga att jag struntar i Thread.Sleep och istället minskar förändringsfaktorn fö att uppnå räknarens visuella funktion.

Ett exempel:

Citat:

private void btn45_Click(object sender, EventArgs e)
{

//här anropas animationer o.d. som är specifika för valt årtal.
//Efter det körs metoder för
//dödsräknaren(utan några Sleep).
//kommer detta fungera utan lagg?

int antal45 = 7000000;
lbltitel.Text = ("Antal döda år 1945: ");
forandra(antal45);

}

Är det just Thread.Sleep som är problemet eller kommer systemet stå stilla då whilesatsen körs ändå? t.ex omen video körs i en annan del av fönstret

Visa signatur

Macbook pro 13", 4gb ddr3, core2duo 2,53ghz, nvidia 9400m

Permalänk
Hedersmedlem
Citat:

Ursprungligen inskrivet av KurreKula
Roligt men lite krångligare. Du får ha en separat tråd som jobbar med det du vill, den i sin tur kan du sleepa hur mycket du vill och det påverkar inte ditt program så att det märks genom att det låser sig. Dock kan du itne hämta och ändra värden på kontroller från andra trådar lätt utan måste då använda dig av funktioner, delegates och invokes

I det här fallet klarar man sig ju dock med en backgroundworker och kan lugnt ignorera de flesta krångligheterna.

Citat:

Ursprungligen inskrivet av Torkelboy
Är det just Thread.Sleep som är problemet eller kommer systemet stå stilla då whilesatsen körs ändå? t.ex omen video körs i en annan del av fönstret

Ja. Sleep får hela den aktuella tråden att vänta, och använder man den även till videouppspelning kommer inte heller den att skonas.