Microsoft Visual C#

thysol

BIOS-Overclocker(in)
Hallo,
Ich habe vor kurzem eine Konsolen Applikation in C# geschrieben. Ich benutzte dass Microsoft Visual Studio C# als IDE dafuer. Dass Programm kann nichts weiter als bis 1000000 zaehlen. Hier ist es:

using System;

class Benchmark
{
public static void Main()
{
string x;
int y = 0;
Benchmark om = new Benchmark();
Console.WriteLine("Enter the letter a if you want to continue.\nIf you want to quit enter the letter b.");
x = Console.ReadLine();

switch (x)
{
case "a":
while (y < 1000000)
{
y = y + om.addition();
Console.Write("{0}\n", y);
}
break;
case "b":
Console.WriteLine("Bye");
break;

}
}
int addition()
{
int y;
y = 1;
return y;
}

}

Ich weiss dass dass Programm Sinnlos ist und es dient nur zur Uebung. Ich habe auch einige Sinnlose Dinge hinzugefuegt um verschiedene Funktionen in C# auszuprobieren. Zum Beispiel die Funktion ganz am Ende die sagt dass y = 1 ist. Die Funtkion ist ueberfluessig. Ich haette auch oben einfach schreiben koennen dass y = 1. Ich habe dass nur gemacht um mit Funktionen vertraut zu werden.

Dass Programm funktioniert wunderbar. Dann wollte ich dass selbe Programm als Windows Forms Applikation schreiben. Ich habe dass dann auch entsprechend umprogrammiert:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace CPUBenchmark
{
public partial class Form1 : Form
{
int x = 1;

public void Loop()
{
while (x < 1000000)
{
addition.Text = x + " seconds";
x = x +1;
}

}


public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{

}

private void startbutton_Click(object sender, EventArgs e)
{
Loop();
startbutton.Enabled = false;
}
}
}

Ich habe in der Standard Form den Startknopf und ein Label hinzugefuegt um die aktuelle Zahl anzusehen. Also "Console.Write("{0}\n", y); = addition.Text = x + " seconds";". Der Microsoft IDE zeigt mir keine Bugs an beim Kompilieren. Wenn ich dass Programm starte erscheint dass Window mit dem Label wo die Zahlen bie eine Million stehen sollen und den Startknopf. Wenn ich den Startknopf druecke werden allerdings im Label die Zahlen nicht angezeigt. Im Taskmanager werden allerdings 25% CPU-Last angezeigt genau wie bei der Konsolen Applikation. Also ein Kern ist zu 100% ausgelastet.

Es werden anscheinend nur die Zahlen nicht angezeigt. Woran liegt dass?

Ich bedanke mich schon mal im Vorraus fuer die Antworten.
 
Ich denke es wird daran liegen, dass die GUI-Updates nicht ausgeführt werden. Normalerweise ist eine Anwendung single-threaded und wenn du da ne dicke Schleife einbastelst, die in diesem Thread läuft, wird die GUI nicht mehr aktualisiert. Das kann man idR auch sehen, wenn man das Fenster verschiebt oder minimiert. Da kommt dann die Sanduhr und/oder das Fenster wird nicht neu gezeichnet.

Du könntest das mittels eines separaten Threads lösen:

Code:
        private delegate void WriteTextCallback(string text);
        private Thread updThread = null;

        public void WriteText(string text)
        {
            if (label1.InvokeRequired)
            {
                WriteTextCallback cb = new WriteTextCallback(WriteText);
                label1.Invoke(cb, new object[] { text });
            }
            else
            {
                label1.Text = text;
            }
        }

        private void btnStart_Click(object sender, EventArgs e)
        {
            if (updThread == null || !updThread.IsAlive)
            {
                updThread = new Thread(new ThreadStart(ThreadFunc));
                updThread.IsBackground = true;
                updThread.Start();
            }
        }

        private void ThreadFunc()
        {
            int x = 1;
            while (x < 10000000)
            {
                WriteText("" + x++);
            }
        }
Da man aus nem anderen Thread nicht direkt auf Elemente des GUI-Threads zugreifen kann (z. B. das Label) muss man da eine Methode vorschalten, die mittles Invoke den Text setzen kann.
 
Erstmal danke fuer die Antwort. Aber wo genau in meinem Programm soll ich deinen Code den einfuegen? Wenn ich ihn direkt unter, "public partial class Form1 : Form", einfuege kommen Compiler Fehlermeldungen. Wenn ich ihn ganz unten einfuege auch. Also wo genau soll der hin?
 
Also erstmal brauchst du noch den richtigen Import für den Thread:
Code:
using System.Threading;

Den Rest kannst du dann irgendwo reinkopieren. Du musst allerdings den Kram auf deine Objekte anpassen: label1 auf den Namen deines Labels und den Click-Eventhandler für den Start-Knopf. Bei letzteren kannst du auch einfach den Code in deinen Handler kopieren. Dann sollte es eigentlich funktionieren ^^
 
Vielen Dank. Es hat funktioniert.:):hail::hail::hail:
Allerdings ist die Performance deutlich schlechter als bei der Konsolen Applikation. Dass dauert viel laenger bis der 1M erreicht. Ist dass Normal?
 
Da steckt ne Menge overhead mit drinnen. Der muss bei jedem Update einen Teil neu zeichnen und das kostet halt ;)
 
Zurück