Prüfung von CGraphic - Fragen und Anregungen - Seite 7

 

Das Debuggen jeder Funktion kann das Problem richtig lokalisieren und eine Aufgabe im SD

Es scheint ein Fehler bei der Berechnung der Leinwandgröße vorzuliegen, denn es wird versucht, eine Gigabyte-Leinwand zu erstellen.

oder ein großes Array wird in einer Art Schleife erstellt

 
o_o:

Das Debuggen jeder Funktion kann das Problem richtig lokalisieren und eine Aufgabe im SD

Es scheint ein Fehler bei der Berechnung der Leinwandgröße vorzuliegen, denn es wird versucht, eine Gigabyte-Leinwand zu erstellen.

Oder es wird ein großes Array in einer Art Schleife erstellt


Mehr davon: "...erzeugt ein riesiges Array in einer Art Schleife", denn ich habe definitiv ein Array mit 300 Elementen gesehen, das im RAM lebt. Während der Laptop "atmete", konnte ich 5 GB sehen.

Das Problem ist nur schwebend - zumindest setzen Video-Aufnahme von dem, was auf dem Bildschirm passiert - zu fangen, die Kombinationen führen zu fatalen Ergebnissen.

 

Bei mir hat es nicht funktioniert

...
      CCurve *curve_b=my_graphic.CurveAdd(arrX,arrY,CURVE_LINES,"Close");
      CAxis *xAxis=my_graphic.XAxis();           // получаем ось X
      //---попеременно комбинирую (комментировать, раскоментировать) строки 87
      //--- и 88 можно словить момент поглощения памяти и зависания компьютера
      //xAxis.AutoScale(false); 
      //xAxis.Type(AXIS_TYPE_DATETIME); 
->    my_graphic.CurvePlotAll();
      my_graphic.Update();
...


 
o_o:

Ich kann es nicht reproduzieren.



Ich habe auch kein klares Playback. Ich habe das gerade gesehen:

      for(int i=0; i<size;++i)

Ist das nicht das Problem?

 
Nein, es ist genau umgekehrt.)
 
o_o:
Nein, im Gegenteil, es ist gut.)

Es macht keinen Unterschied. Ein normaler Compiler sollte diese Optimierungen selbst vornehmen.

Nach der Beschreibung zu urteilen, haben wir den Verdacht, dass das Problem mit einem Speicherleck zu tun hat und vielleicht gar nicht im Code liegt.

 
o_o:
Nein, es ist das Gegenteil von gut )

Habe es auf das übliche i++ gesetzt und mehr erweiterten Code kompiliert = wieder 5GB :). Ich gebe den Code später, wenn wir schon mal dabei sind...
 
Vladimir Karputov:


Dies ist wahrscheinlicher: "...erzeugt ein riesiges Array in einer Art Schleife", denn ich habe definitiv ein Array mit 300 Elementen gesehen, das RAM verursacht. Während der Laptop "atmete", konnte ich 5 GB sehen.

Das Problem ist nur fließend - man könnte genauso gut ein Drittanbieter-Kameravideo von dem, was passiert, auf den Bildschirm bringen, um zu sehen, welche Kombinationen zu einem fatalen Ergebnis führen.

Guten Tag!

Der Grund für das Hängenbleiben ist die Deaktivierung des automatischen Nähens: xAxis.AutoScale(false)

In diesem Fall haben Sie einen sehr großen Bereich von Werten im Array arrX gespeichert:

double MAX = arrX[ArrayMaximum(arrX)]; // 1497438000.0
double MIN = arrX[ArrayMinimum(arrX)]; // 988653600.0

Und Sie ändern den Wert des Schritts zur Aufteilung der Achse nicht, wenn Sie die Signatur my_graphic.XAxis().DefaultStep() setzen, und da er standardmäßig 25,0 beträgt, ist die Anzahl der Signaturen, die die Bibliothek zu erzeugen versucht, gleich:

m_xsize=(int)MathRound((max-min)/step)+1; // 20351377

Das führt dazu, dass es zwei Möglichkeiten gibt:

  1. Lassen Sie die automatische Abtrennung.
  2. Übertragen Sie einen geeigneten Wert an die Methode my_graphic.XAxis().DefaultStep(), um den Standardschritt zu ändern (ich erhielt den Wert 50878800.0 für die Aufteilung in 10 Teile)
 
Vladimir Karputov:

Fixiert auf vertrautes i++ und kompiliert mehr erweiterten Code = wieder 5GB :). Ich gebe den Code später ein, während ich hänge...


Irgendwo hier drin:

Der Hund ist irgendwo hier drin

Schwierigkeiten. Ich spoilere nur diese Zeilen.

Dateien:
 
Roman Konopelko:

Guten Tag!

Die Ursache für das Hängenbleiben ist die Deaktivierung des Auto-Stepping: xAxis.AutoScale(false)

Sie haben einen sehr großen Bereich von Werten im Array arrX gespeichert:

Und Sie ändern den Wert des Schritts zur Aufteilung der Achse nicht, wenn Sie die Signatur my_graphic.XAxis().DefaultStep() setzen, und da er standardmäßig 25,0 beträgt, ist die Anzahl der Signaturen, die die Bibliothek zu erzeugen versucht, gleich:

Das führt dazu, dass es zwei Möglichkeiten gibt:

  1. Zum Verlassen des automatischen Anhängens.
  2. Übergeben Sie einen geeigneten Wert an die Methode my_graphic.XAxis().DefaultStep(), um den Standardabstand zu ändern (ich habe einen Wert von 50878800.0 für eine 10-teilige Aufteilung erhalten)


Danke! Schneiden (entfernen) Sie die Linien mit AutoScale und mit der Stufeneinstellung im Allgemeinen.


Und gleich noch ein Vorschlag: Ich kann für beide Achsen gleichzeitig eine schräge (abgewinkelte) Schrift erstellen (my_graphic.FontSet("Arial",10,0,180);). Können wir diese Methode zur Einstellung der Schriftart (oder des Winkels) nicht für eine separate Achse verwenden?

Dateien: