Form unglaublich langsam

Die Programmiersprache C# und Programmierung im .NET Framework/Mono
Antworten
Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Form unglaublich langsam

Beitrag von cloidnerux » Mo Aug 12, 2013 6:32 pm

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?
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Form unglaublich langsam

Beitrag von Xin » Mo Aug 12, 2013 7:49 pm

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)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Form unglaublich langsam

Beitrag von cloidnerux » Mo Aug 12, 2013 9:24 pm

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.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Form unglaublich langsam

Beitrag von Xin » Di Aug 13, 2013 9:08 am

Kein Code, keine Kristallkugel, keine Ahnung. ^^
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Form unglaublich langsam

Beitrag von cloidnerux » Di Aug 13, 2013 9:13 am

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.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Form unglaublich langsam

Beitrag von Xin » Di Aug 13, 2013 9:39 am

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?!
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

GilbertDur
Beiträge: 105
Registriert: Fr Mär 01, 2013 10:31 am

Re: Form unglaublich langsam

Beitrag von GilbertDur » Di Aug 13, 2013 9:56 am

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.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Form unglaublich langsam

Beitrag von cloidnerux » Di Aug 13, 2013 10:07 am

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.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Form unglaublich langsam

Beitrag von Xin » Di Aug 13, 2013 1:16 pm

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?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Form unglaublich langsam

Beitrag von cloidnerux » Di Aug 13, 2013 1:23 pm

Ö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.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Antworten