Form unglaublich langsam
- cloidnerux
- Moderator
- Beiträge: 3123
- Registriert: Fr Sep 26, 2008 4:37 pm
- Wohnort: Ram (Gibts wirklich)
Form unglaublich langsam
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?
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
quod erat expectandum
- Xin
- nur zu Besuch hier
- Beiträge: 8858
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: Form unglaublich langsam
Ich kenne den ZedGraph nicht, aber kann es sein, dass die Garbage Collection läuft?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 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.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
- cloidnerux
- Moderator
- Beiträge: 3123
- Registriert: Fr Sep 26, 2008 4:37 pm
- Wohnort: Ram (Gibts wirklich)
Re: Form unglaublich langsam
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.
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
quod erat expectandum
- Xin
- nur zu Besuch hier
- Beiträge: 8858
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: Form unglaublich langsam
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.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
- cloidnerux
- Moderator
- Beiträge: 3123
- Registriert: Fr Sep 26, 2008 4:37 pm
- Wohnort: Ram (Gibts wirklich)
Re: Form unglaublich langsam
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:
Aufgerufen wird es jetzt so:
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.
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;
}
}
Code: Alles auswählen
void Func()
{
BeginInvoke(new SimpleFunction(displayMyForm));
}
void displayMyForm()
{
viewer.Data = data;
Invoke(new SimpleFunction(viewer.Show));
Application.DoEvents();
}
Sehr merkwürdig das ganze.
MfG cloidnerux.
Redundanz macht wiederholen unnötig.
quod erat expectandum
quod erat expectandum
- Xin
- nur zu Besuch hier
- Beiträge: 8858
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: Form unglaublich langsam
Interessant. Da Du Application.DoEvents() aufrufst, nimmt das Form jetzt alle Events aller Forms an?!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.
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.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
-
- Beiträge: 105
- Registriert: Fr Mär 01, 2013 10:31 am
Re: Form unglaublich langsam
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.
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.
- cloidnerux
- Moderator
- Beiträge: 3123
- Registriert: Fr Sep 26, 2008 4:37 pm
- Wohnort: Ram (Gibts wirklich)
Re: Form unglaublich langsam
Ich habe Daten die per Seriellen Port reinkommen, und sobald ein Muster erkannt wird, soll dieses auf dieser Form angezeigt werden.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.
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
quod erat expectandum
- Xin
- nur zu Besuch hier
- Beiträge: 8858
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: Form unglaublich langsam
Öhm, kann es sein, dass der einfach laufend auf Eingaben des seriellen Ports wartet?cloidnerux hat geschrieben:Ich habe Daten die per Seriellen Port reinkommen, und sobald ein Muster erkannt wird, soll dieses auf dieser Form angezeigt werden.
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.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
- cloidnerux
- Moderator
- Beiträge: 3123
- Registriert: Fr Sep 26, 2008 4:37 pm
- Wohnort: Ram (Gibts wirklich)
Re: Form unglaublich langsam
Nein. Die Eingaben funktionieren per Event.Öhm, kann es sein, dass der einfach laufend auf Eingaben des seriellen Ports wartet?
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
quod erat expectandum