Hallo in die Runde.
Irgendwann wurde die Funktion New Picture derart umgestellt, dass es einen Fehler gibt, wenn man für die Breite oder Höhe den Wert 0 vorgibt.
Das kam bei mir zwischenzeitlich schon mal vor, weshalb ich mir eine eigene Routine dafür gebastelt habe.
Jetzt bekomme ich dort eine OutOfMemoryException gemeldet und verstehe nicht weshalb.
Hier ein Bild, wie es mir Xojo (2017r1) anbietet:
Im unteren Teil ist ein Ausschnitt der Aktivitätsanzeige zu sehen. Demnach sollte es kein Speicherproblem geben. Selbst wenn der physikalische Speicher knapp werden sollte, würde doch ausgelagert. Demnach kann es doch eigentlich nie zu einer OutOfMemoryException kommen. OK, das Bild ist nicht wirklich klein (wenn ich richtig gerechnet habe etwa 2,1GB).
Normalerweise läuft die Routine auch immer problemfrei durch. Ich hatte erst eine Anwendermeldung diesbezüglich und jetzt das erste Mal hier bei mir.
Vieleicht ist es noch wichtig zu wissen, dass zwischen Auftreten des Fehlers und Erstellung des Bildes der Aktivitätsanzeige einige Stunden nicht am Rechner war. Es kann also zum Fehlerzeitpunkt etwas anderes ausgesehen haben.
Hat jemand eine Idee, wo das Problem liegt?
Oder besser, wie ich es vermeide?
Sind das nicht über 3 GB? Dann hat Dein Programm bestimmt das eine oder andere gewerkelt, sprich der Speicher ist schon ein wenig fragmentiert. Dann kann es leicht sein, daß keine 3 GB mehr verfügbar sind. Entweder machst Du das Bild kleiner oder Du gehst auf 64bit.
Selbst wenn der Speicher durch Fragmentierung keine 2GB mehr bieten sollte, müsste das dann nicht automatisch aufgeräumt werden?
Die Aktivitätsanzeige zeigt jedenfalls nur 32MB als Speicherbedarf an. Das sollte also selbst für 32Bit Anwendungen genügen.
Ein neues Projekt mit diesem Code:
Sub Open()
dim p as picture
p=new picture(19842,27874,32)
Break
End Sub
hat keine Probleme.
Viel wichtiger wäre mir, wie ich im Vorfeld erkennen kann, dass ich ein Problem bekomme. Kann ich den verfügbaren Speicherplatz erfragen?
…
Ich habe gerade obigen Prüfcode erweitert und bekomme hiermit Probleme:
p=New Picture(min(max(1,19842),32000),min(max(1,27874),32000),32)
Die Speicherfragmentierung wird nicht automatisch aufgerumt. Das ist keine Festplatte. Bei Xojo fhrte das z.B. zu den hufigen Abstrzen beim Kompilieren fr 64bit. Auch da konnte ich sehen, da der Speicher nur bis ca. 1 GB belegt ist.
Hast Du es schon mit einem Try/Catch versucht? Es kann sein, da das dann nicht geht, weil ja der Speicher belegt ist.
Mit Try/Catch kann die die Fehlermeldung abfangen und Nil zurückliefern. In dem Fall wird dann eine kleinere Version ausgegeben. Da hatte ich offenbar schon dran gedacht
Die 64-Bit Variante hat da tatsächlich kein Problem.