Eventqueue zulöten! (vorher: Bug, CloseWindow)

Anfängerfragen zum Programmieren mit PureBasic.
DNA
Beiträge: 40
Registriert: 25.02.2006 23:54

Eventqueue zulöten! (vorher: Bug, CloseWindow)

Beitrag von DNA »

vorher:
PB 4.3 Bei Closewindow gibt nicht Speicher frei

Keine Ahnung ob das bei den älteren PB Versionen auch so war, aber ich hab bei PB 4.3 gemerkt, wenn ich ein Fenster erstelle und es später schließe, wird nicht immer der ganze Speicher wieder freigegeben, der für das Fenster benötigt wurde. Ich hab mir dabei mit dem Taskmanager die Speicherauslastung für das Prog angeschaut und konnte dabei beobachten, dass die Speicherauslastung immer mehr wurde. Zwar ist die zunehmende Auslastung meistens sehr klein (nur ein paar KBytes) aber trotzdem gefällt es mir nicht und wollte das mal hier melden.

Hier ein kleines Beispiel mit dem ihr das selbst begutachten könnt:

Code: Alles auswählen

For i = 1 To 10000
  If OpenWindow(0, 400, 400, 10, 10, "test window")

    ;warten bis das Fenster geöffnet wurde
    While Not IsWindow(0)
      Delay(1)
    Wend

    CloseWindow(0)

    ;warten bis das Fenster geschlossen wurde
    While IsWindow(0)
      Delay(1)
    Wend

  EndIf
Next
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

/:->

glaubst du wirklich, das wäre ein PB-Bug?
DNA
Beiträge: 40
Registriert: 25.02.2006 23:54

Beitrag von DNA »

Ja, das glaube ich oder hast du dafür eine bessere Erklärung?
Schließlich sollte die Anwendung den Speicher ordnungsgemäß für andere Anwendungen zur verfügung stellen, also wieder freigeben, sobald es nicht mehr benötigt wird. Da ich nun mal nicht weiß, wie der Code für den Compiler aussieht, muss ich nun mal davon ausgehen, dass es ein Bug von PB ist und nicht vom Betriebssystem, worauf du wahrscheinlich anspielen möchtest.

Habs mal mit z.B. dem Firefox als Gegenrpobe getestet und das Infofenster ein paar mal hintereinander geöffnet. Zuerst wird da auch die Speicherauslastung mehr, was auch verständlich ist, aber wenns geschlossen wird, wird nach ne Zeit der Speicher wieder freigegeben, was jedoch bei den Anwundungen von PB nicht so ist.

Deswegen ist es Grund genug anzunehmen, dass es ein Bug von PB ist und nichts anderes. Und nebenbei bemerkt, wird ab und zu, bei dem gleichen Fenster, was meine Anwendung erstellt, plötzlich die Speicherauslastung um ca. 20.000 KBs mehrs und nicht wie sonst auch immer nur um ein paar KBs. Dann ist die Speicherauslastung nicht mehr bei 3.000 sondern bei 30.000. Also schon das 10fache von dem, was es sonst immer benötigt. Komischerweise ist es nur mit den Fenstern so, die ich über PB erstelle. Wenn z.B. Threads erzeugt werden, gibs keine Probleme und über andere Anwendungen, die nicht mit PB geschrieben wurden, habe ich dieses Verhalten nicht beobachten können.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Die Objektliste wird erstellt sobald irgendetwas mit Fenstern vorkommt.
Diese wird auch erst dann wieder freigegeben (wie jede andere
Objektliste auch) wenn man das Programm beendet, selbst wenn man
dann schon lange keine Fenster mehr hat. Bei einer statischen ID, in
deinem Fall die 0, kannst du das in etwa mit einem Array vergleichen, es
wuerde keinen Sinn machen den Index 0 zu loeschen und den Rest nach
unten zu schieben.

So, und jetzt darf mich Freak schlagen, falls ich scheisse geschrieben habe. <)
DNA
Beiträge: 40
Registriert: 25.02.2006 23:54

Beitrag von DNA »

edel hat geschrieben:Die Objektliste wird erstellt sobald irgendetwas mit Fenstern vorkommt.
Diese wird auch erst dann wieder freigegeben (wie jede andere
Objektliste auch) wenn man das Programm beendet, selbst wenn man
dann schon lange keine Fenster mehr hat. Bei einer statischen ID, in
deinem Fall die 0, kannst du das in etwa mit einem Array vergleichen, es
wuerde keinen Sinn machen den Index 0 zu loeschen und den Rest nach
unten zu schieben.

So, und jetzt darf mich Freak schlagen, falls ich scheisse geschrieben habe. <)
das ist ja schön und gut, aber dann dürfte dennoch nicht der speicher mehr werden, der benötigt wird. Bei einem Array wird ja auch nicht jedesmal neuer speicher reserviert um da neue werte an die stelle index 0 zu schreiben. (von REDIM mal abgesehen) Und logisch wäre es auch, diese sogenannte Objektliste zu löschen, zumindest die Einträge die nicht mehr gültig sind oder nicht mehr benötigt werden, was dazu führen würde, dass der speicher wieder freigegeben wird. aber hier ist es nicht so.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Speicher wird von Windows angefordert und von Windows freigegeben.
PB teilt Windows nur mit das dieser Speicher freigegeben werden kann,
Windows wird dies dann bei Bedarf auch machen.

In Deiner Schleife, wo Du die CPU kochst, wird Windows wohl kaum Zeit
dafür finden. Desweiteren wächst bei mir der Speicherbedarf nicht, hängt
also auch vom OS (Version) ab.

Desweiteren ist PB nicht dafür designed unsinnigen Code auszuführen,
es kann also kein Bug sein, der sitzt wie meist vorm PC
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
freak
PureBasic Team
Beiträge: 766
Registriert: 29.08.2004 00:20
Wohnort: Stuttgart

Beitrag von freak »

Es sind die Windows-Messages die sich hier stapeln. Das Erstellen eines Fensters erzeugt schon eine Reihe von Messages, und die werden hier nicht abgearbeitet. Also wächst die Queue unaufhörlich.

Pack ein "While WindowEvent(): Wend" vor das CloseWindow() und das Problem ist behoben.
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

ahaaa .. endlich mal eine vernünftige Anwendung für diese Schleife :allright: :mrgreen:
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
DNA
Beiträge: 40
Registriert: 25.02.2006 23:54

Beitrag von DNA »

@ts-soft: Nja, ich hoffe mal, das stimmt auch was du hier schreibst. Ich bin davon ausgegangen, dass es an PB liegt, weil man bei AllocateMemory() den angeforderten Speicher mit FreeMemory() selbst wieder freigeben muss und deshalb habe ich gedacht, dass bei dem Schließen des Fenster so ne art FreeMemory vergessen wurde. Und zu dem Letzten was du geschrieben hast, natürlich ist dieser Code hier unsinnig, das war ja auch nur ein Beispiel. Kann ja nicht meinen gesammten Code hier reinmachen, das ist nicht grade wenig und man bräuchte Zeit um den zu verstehen.

@freak: in meiner Eigentlichen Anwendung hab ich es auch so gemacht, nur liegst nicht daran.

Muss mich korrigieren, liegt doch an den Messages. Da ich die Schleife anders beende, als mit dem CloseEvent vom Fenster, bleiben wohl noch ein paar Messages in der Queue. Danke an euch alle. *g*
Antworten