Seite 1 von 1

Form unglaublich langsam

Verfasst: Mo Aug 12, 2013 6:32 pm
von cloidnerux
Ich hab in einem Projekt eine neue WinForm angelegt, mit nur einem ZedGraph Element drauf.
Dieser Form wird über eine Methode eine Liste mit Daten übergeben, die per FFT gewandelt und dargestellt werden.
Das Funktioniert.
Nun ist aber der Cursor über der Form nur im Sanduhr/Ladekreis Zustand und bedienen lässt sich nichts, als ob da irgendeine Methode unmöglich viel Berechnen muss. Das kann aber keine meiner Methoden sein, denn es gibt nur 2 neben dem eigentlichen Konstruktor.
Hat irgendwer von euch schon einmal ein solches Verhalten gehabt?

Re: Form unglaublich langsam

Verfasst: Mo Aug 12, 2013 7:49 pm
von Xin
cloidnerux hat geschrieben:Nun ist aber der Cursor über der Form nur im Sanduhr/Ladekreis Zustand und bedienen lässt sich nichts, als ob da irgendeine Methode unmöglich viel Berechnen muss. Das kann aber keine meiner Methoden sein, denn es gibt nur 2 neben dem eigentlichen Konstruktor.
Hat irgendwer von euch schon einmal ein solches Verhalten gehabt?
Ich kenne den ZedGraph nicht, aber kann es sein, dass die Garbage Collection läuft?
Ich weiß ja nicht, wieviele Daten Du verarbeitet hast und wie aufwendig die verarbeitet werden (also wie oft dabei new gerufen wird)

Re: Form unglaublich langsam

Verfasst: Mo Aug 12, 2013 9:24 pm
von cloidnerux
ZedGraph ist ein Graph Tool was recht gut läuft, ich habe es in einigen anderen Projekten auch am Laufen.
Angezeigt werden maximal 10000 Datenpunkte, die ein mal hinzugefügt werden.
Das ist aber nicht das Problem, es wird angezeigt. Die Form ist dann aber nicht mehr Ansprechbar, es lädt aber es tut sich nichts.
Kann es vlt an irgendwelchen Thread Merkwürdigkeiten handeln?

Edit: Es hat irgendwas mit den Threads zu tun. Rufe ich die Form per Invoke oder BeginInvoke auf, wird diese zwar angezeigt, aber ohne Steuerelemente.

Re: Form unglaublich langsam

Verfasst: Di Aug 13, 2013 9:08 am
von Xin
Kein Code, keine Kristallkugel, keine Ahnung. ^^

Re: Form unglaublich langsam

Verfasst: Di Aug 13, 2013 9:13 am
von cloidnerux
Ok, ich habe eine Lösung gefunden, wenn ich auch noch nicht so recht weiß, wieso sie Funktioniert.
Das ist der Code der Form. Ich kann unabhängig Daten verändern, die Anzeige erfoglt über der Form-Events:

Code: Alles auswählen

    public partial class MyForm: Form
    {
        delegate void SimpleFunction();
        Complex[] data;
        bool newData;

        public List<double> Data
        {
            set
            {
                //Daten eintragen
                newData = true;
                this.Invalidate();
            }
        }

        public MyForm()
        {
            InitializeComponent();
            foreach (GraphPane pane in zedGraphControl1.MasterPane.PaneList)
                pane.IsFontsScaled = false;
        }

        private void DisplayData()
        {
            //Daten anzeigen, standard
        }

        private void SetSize()
        {
            zedGraphControl1.Location = new Point(0, 0);
            // Leave a small margin around the outside of the control
            zedGraphControl1.Size = new Size(ClientRectangle.Width,
                                    ClientRectangle.Height);
        }

        private void MyForm_Load(object sender, EventArgs e)
        {
            //Daten verarbeiten
            DisplayData();
            newData = false;
        }

        private void MyForm_Paint(object sender, PaintEventArgs e)
        {
            //Daten verarbeiten
            DisplayData();
            newData = false;
        }
    }
Aufgerufen wird es jetzt so:

Code: Alles auswählen

void Func()
{
    BeginInvoke(new SimpleFunction(displayMyForm));
}

void displayMyForm()
{
    viewer.Data = data;
    Invoke(new SimpleFunction(viewer.Show));
    Application.DoEvents();
}
Anscheinend führt erst das Application.DoEvents() dazu, dass eine in einem unabhängigen Thread gestartete WinForm auch wirklich Events entgegen nimmt.
Sehr merkwürdig das ganze.

MfG cloidnerux.

Re: Form unglaublich langsam

Verfasst: Di Aug 13, 2013 9:39 am
von Xin
cloidnerux hat geschrieben:Anscheinend führt erst das Application.DoEvents() dazu, dass eine in einem unabhängigen Thread gestartete WinForm auch wirklich Events entgegen nimmt.
Sehr merkwürdig das ganze.
Interessant. Da Du Application.DoEvents() aufrufst, nimmt das Form jetzt alle Events aller Forms an?!

Re: Form unglaublich langsam

Verfasst: Di Aug 13, 2013 9:56 am
von GilbertDur
Mal ne Frage. Hast du anfangs versucht mit Zedgraph die Form von einem anderen Thread aus zu aktualisieren? Das würde zumindest erklären, warum du BeginInvoke bzw. Invoke benötigt hast.

Die Application.DoEvents() Methode wird ansonsten hier ganz gut erklärt:

http://openbook.galileocomputing.de/vis ... 8ba2bb96c3

Ich kenne jetzt Zedgraph leider auch nicht so gut. Habe immer die vorhandenen Chart-Controls genutzt.

Re: Form unglaublich langsam

Verfasst: Di Aug 13, 2013 10:07 am
von cloidnerux
Mal ne Frage. Hast du anfangs versucht mit Zedgraph die Form von einem anderen Thread aus zu aktualisieren? Das würde zumindest erklären, warum du BeginInvoke bzw. Invoke benötigt hast.
Ich habe Daten die per Seriellen Port reinkommen, und sobald ein Muster erkannt wird, soll dieses auf dieser Form angezeigt werden.
Nun wurde ursprünglich die Form angezeigt, mal mit mal ohne Steuerelemente, aber es wurden keine Eingaben auf keiner gerade Angezeigten Form mehr entgegen genommen, die komplette Anwendung war eingefroren.
Das BeginInvoke und das Invoke sind notwendig, sowie das Application.DoEvents(), sonst ist keine Eingabe, keine Interaktion oder sonst etwas möglich.
Und aus der Natur der Sache, sind es Thread übergreifende Zugriffe.

Re: Form unglaublich langsam

Verfasst: Di Aug 13, 2013 1:16 pm
von Xin
cloidnerux hat geschrieben:Ich habe Daten die per Seriellen Port reinkommen, und sobald ein Muster erkannt wird, soll dieses auf dieser Form angezeigt werden.
Öhm, kann es sein, dass der einfach laufend auf Eingaben des seriellen Ports wartet?

Re: Form unglaublich langsam

Verfasst: Di Aug 13, 2013 1:23 pm
von cloidnerux
Öhm, kann es sein, dass der einfach laufend auf Eingaben des seriellen Ports wartet?
Nein. Die Eingaben funktionieren per Event.
Das funktioniert auch, denn auf der eigentlichen Form werden die Daten in Echtzeit angezeigt. Das Funktioniert wunderbar, bis zu dem Zeitpunkt wo die zweite Form geöffnet wird.