Forum | | | | - Seite 1 - |
| GDL | Hallo, habe ein Programm, das meinen freien Speicher(240MB) beim Laden kurzfristig auf 2 MB bringt und danach wieder auf 235 MB ansteigen lässt.
Durch Fehlersuche fand ich den Übeltäter KompilierenMarkierenSeparieren
proc leiste
windowstyle 3
arbeitsleiste&=create("window",%hwnd,"Arbeitsleiste",1,%maxy-190,1000,90)
name$= astart$+"\bilder\bild1.BMP"
bild_&[9000] = @Create("HPIC", -1, name$)
ger1&=@Create("PicButton",arbeitsleiste&,bild_&[9000],1,1,30,30,)
name$= astart$+"\bilder\bild2.BMP"
bild_&[8999] = @Create("HPIC", -1, name$)
ger2&=@Create("PicButton",arbeitsleiste&,bild_&[8999],31,1,30,30,)
name$= astart$+"\bilder\bild3.BMP"
bild_&[8998] = @Create("HPIC", -1, name$)
bog1&=@Create("PicButton",arbeitsleiste&,bild_&[8998],61,1,30,30,)
name$= astart$+"\bilder\bild4.BMP"
bild_&[8997] = @Create("HPIC", -1, name$)
bog2&=@Create("PicButton",arbeitsleiste&,bild_&[8997],91,1,30,30,)
name$= astart$+"\bilder\bild5.BMP"
bild_&[8996] = @Create("HPIC", -1, name$)
bog3&=@Create("PicButton",arbeitsleiste&,bild_&[8996],121,1,30,30,)
name$= astart$+"\bilder\bild6.BMP"
bild_&[8995] = @Create("HPIC", -1, name$)
bog4&=@Create("PicButton",arbeitsleiste&,bild_&[8995],151,1,30,30,)
name$= astart$+"\bilder\bild7.BMP"
bild_&[8994] = @Create("HPIC", -1, name$)
wei1&=@Create("PicButton",arbeitsleiste&,bild_&[8994],181,1,30,30,)
name$= astart$+"\bilder\bild8.BMP"
bild_&[8993] = @Create("HPIC", -1, name$)
wei2&=@Create("PicButton",arbeitsleiste&,bild_&[8993],211,1,30,30,)
name$= astart$+"\bilder\bild9.BMP"
bild_&[8992] = @Create("HPIC", -1, name$)
wei3&=@Create("PicButton",arbeitsleiste&,bild_&[8992],241,1,30,30,)
name$= astart$+"\bilder\bild10.BMP"
bild_&[8991] = @Create("HPIC", -1, name$)
wei4&=@Create("PicButton",arbeitsleiste&,bild_&[8991],271,1,30,30,)
name$= astart$+"\bilder\bild11.BMP"
bild_&[8990] = @Create("HPIC", -1, name$)
wei5&=@Create("PicButton",arbeitsleiste&,bild_&[8990],301,1,30,30,)
name$= astart$+"\bilder\bild12.BMP"
bild_&[8989] = @Create("HPIC", -1, name$)
wei6&=@Create("PicButton",arbeitsleiste&,bild_&[8989],331,1,30,30,)
name$= astart$+"\bilder\bild13.BMP"
bild_&[8988] = @Create("HPIC", -1, name$)
wei7&=@Create("PicButton",arbeitsleiste&,bild_&[8988],361,1,30,30,)
name$= astart$+"\bilder\bild14.BMP"
bild_&[8987] = @Create("HPIC", -1, name$)
wei8&=@Create("PicButton",arbeitsleiste&,bild_&[8987],391,1,30,30,)
name$= astart$+"\bilder\bild19.BMP"
bild_&[8986] = @Create("HPIC", -1, name$)
kw1&=@Create("PicButton",arbeitsleiste&,bild_&[8986],421,1,30,30,)
name$= astart$+"\bilder\bild20.BMP"
bild_&[8985] = @Create("HPIC", -1, name$)
kw2&=@Create("PicButton",arbeitsleiste&,bild_&[8985],451,1,30,30,)
name$= astart$+"\bilder\bild15.BMP"
bild_&[8984] = @Create("HPIC", -1, name$)
sig1&=@Create("PicButton",arbeitsleiste&,bild_&[8984],481,1,30,30,)
name$= astart$+"\bilder\bild16.BMP"
bild_&[8983] = @Create("HPIC", -1, name$)
sig2&=@Create("PicButton",arbeitsleiste&,bild_&[8983],511,1,30,30,)
name$= astart$+"\bilder\bild18.BMP"
bild_&[8982] = @Create("HPIC", -1, name$)
ap&=@Create("PicButton",arbeitsleiste&,bild_&[8982],541,1,30,30,)
name$= astart$+"\bilder\bild17.BMP"
bild_&[8981] = @Create("HPIC", -1, name$)
bm&=@Create("PicButton",arbeitsleiste&,bild_&[8981],571,1,30,30,)
tas&=@Create("Button",arbeitsleiste&,"Ta",601,1,30,30,)
text&=@Create("Button",arbeitsleiste&,"Text",631,1,50,30,)
name$= astart$+"\bilder\bild21.BMP"
bild_&[8980] = @Create("HPIC", -1, name$)
dwei&[1]=@Create("PicButton",arbeitsleiste&,bild_&[8980],690,1,60,36)
name$= astart$+"\bilder\bild22.BMP"
bild_&[8979] = @Create("HPIC", -1, name$)
dwei&[2]=@Create("PicButton",arbeitsleiste&,bild_&[8979],755,1,60,36)
name$= astart$+"\bilder\bild23.BMP"
bild_&[8978] = @Create("HPIC", -1, name$)
dwei&[3]=@Create("PicButton",arbeitsleiste&,bild_&[8978],820,1,36,60)
name$= astart$+"\bilder\bild24.BMP"
bild_&[8977] = @Create("HPIC", -1, name$)
dwei&[4]=@Create("PicButton",arbeitsleiste&,bild_&[8977],875,1,36,60)
name$= astart$+"\bilder\bild25.BMP"
bild_&[8976] = @Create("HPIC", -1, name$)
winkel&[1]=@Create("PicButton",arbeitsleiste&,bild_&[8976],1,35,30,30)
name$= astart$+"\bilder\bild26.BMP"
bild_&[8975] = @Create("HPIC", -1, name$)
winkel&[2]=@Create("PicButton",arbeitsleiste&,bild_&[8975],31,35,30,30)
sleep 5000 sonst bricht der Speicher ein
endproc
Mit sleep 5000 an dieser Stelle bricht der Speicher nicht mehr ein.Je kleiner die Sleepzeit umso weiter bricht der Speicher ein.
Servus Georg |
| | | | |
| | | | | - Seite 1 - |
| Rolf Koch | *lol* Nee egal ob klein oder gross, einfach immer nur die selbe Variable BILD& ohne Arrayzähler. |
| | | | |
| | Rolf Koch | Aber Stopp: Wie sieht PICBUTTON aus (wird wohl ne Subproc sein?) - vielleicht passiert da ja was (irgendwas nicht freigegeben oder so)? |
| | | | |
| | | | - Seite 2 - |
| | GDL | Hallo Rolf, die Bilder sind ein Container und werden später dann zusätzlich auf neu erstellte Controls ebenso automatisch übertragen. Die Anfangsbutton sind nur Auswahlbutton für neue Eisenbahnkomponenten.
Habe jetzt jede Variation durchprobiert. Habe sleep auch an den Anfang der Procedure gestellt um was zu Testen. Hier ist selbiges.Ich vermute es hängt mit dem declare bild_&[9000] zusammen. Der Rechner braucht halt irgendwo Zeit ,da die Proc leiste gleich nach window... aufgerufen wird.
Servus Georg |
| | | | |
| | GDL | Da keine Fehlermeldung kommt und das Proggi einwandfrei läuft iss es ja auch gleich. Mir fiels halt nur auf, da bei meinem PII Rechner, auch ohne sleep, ne 10 sec. Gedenkminute eingelegt wird. Werds später mal auf Dateien auslagern.
Danke nochmals.
Servus Georg |
| | | | |
| | | Hallo Georg...
Mit TNT kann man beim Erstellen einer Speicherbitmap sehr gut sehen, das bei grafischen Objekten nicht nur im virtuellen Speicher deines Prozesses gearbeitet wird, sondern in noch viel größerem Maße in dem von CSRSS.EXE
Was geschieht beim Starten eines Prozesses? Der Prozess soll schnell zur Verfügung stehen => die dynamische Priorität ist sehr hoch...
Meine Theorie: CSRSS läuft mit normaler Priorität. Dein Prozess klaut also beim Starten CSRSS Prozessorzeit => Bereiche, die vorher von CSRSS zugewiesen wurden, können nicht in der erforderlichen Zeit wieder freigegeben werden.. a) Mit Sleep gibts du Prozessorzeit für x-Millisekunden ab, CSRSS kommt dann wieder an die Reihe und kann endlich saubermachen. b) Dynamische Priorität verringert sich (wenn nichts besonders passiert) mit der Laufzeit des Prozesses. Irgendwann ist die dynamische Priorität so gering, das CSRSS wieder ins Rollen kommt und räumt den vorher genutzten Speicher beiseite.
Das Problem liegt also nicht (direkt) an deinem Programm.
Hat jemand eine bessere Erklärung?
PS: 30*2KB kann man so nicht unbedingt rechnen. - Jede Seite im Speicher ist etwa 4kB groß. - Heapkontrollstrukturen müssen da auch noch hinzugerechnet werden - Handle nimmt Platz weg - .. |
| | | | |
| | GDL | Hallo Andreas,
deine Theorie deckt sich ja mit meiner Vermutung. Nur passiert es auch bereits bei einem pic, wenn vorher declare bild&[9000]. Bei declare bild&[10] und 10 pics ist alles in Ordnung.
Servus Georg |
| | | | |
| | | Was macht den dein Prozess bei declare bild&[9000]? Er initialisiert Speicher, und das nicht gerade wenig. Da ist also jemand stark beschäftig. Passiert das in der Initialisierungsphase, kann CSRSS den für das Anzeigen von grafischen Elementen bereitgestellten Speicher nicht wieder freigeben, da CSRSS zu diesem Zeitpunkt unterhalb der Priorität von deinem Prozess liegt. Kann das leider nicht überprüfen, da ich dein komplettes Programm nicht habe. |
| | | | |
| | Rolf Koch | Das meinte ich ja mit bild&. Jedoch verstehe ich Dein Anliegen diese Bilder im Programm bereitzuhalten. Leider weis ich nicht, wieviel Speicher für je ein Array bereitgestellt wird. Müsste Roland beantworten. Denn 9000 ist wirklich sehr viel. Ich überlege grad, wie Du die Bilder anstatt per Array irgendwie anders festhalten kannst. |
| | | | |
| | GDL | Bin gerade dabei Modellbahnsteuerung für Rechner mit Win98 und 64MB RAM flotter hinzubekommen. Es sind aber keine Fehlermeldungen in all diesen Fällen. Wenn du unter Wettbewerbe die letzte Installversion im letzten Posting holst hast du alles komplett. Nach dem Einlogen(asxdf) unter Auswahlbutton Plan ist das Programm in der Rohform.
Servus Georg |
| | | | |
| | | Werd mal probieren, ob es bei mir läuft. Wie gesagt, was ich hier kackfrech einfach mal so behaupte ist, daß nicht dein Prozess den Speicher verpulvert, sondern CSRSS.
Gruß
Andreas |
| | | | |
| | Rolf Koch | Ich sehe grad, Deine Bilder haben sowieso Bild+Nr.Bmp. Versuchs doch mal so: KompilierenMarkierenSeparierenname$= astart$+"\bilder\bild2.BMP"
bild&=@Create("HPIC", -1, name$)
ger1&=@Create("PicButton",arbeitsleiste&,bild&,1,1,30,30,)
destroywindow bild&
name$= astart$+"\bilder\bild2.BMP"
bild& = @Create("HPIC", -1, name$)
ger2&=@Create("PicButton",arbeitsleiste&,bild&,31,1,30,30,)
destroywindow bild&
Du hast jetzt kein Array, das ist klar. Jedoch kannst Du ja später im Programm doch sehr schön bild& je nach Aktion wieder das richtige Bild zufügen: Beispiel: Es wird das 10te Bild wieder benötigt: (Aktion wäre hier 10 und würde in zahlenausleser$ gespeichert) KompilierenMarkierenSeparierenbild$=astart$+"\bilder\bild"+zahlenausleser$+".BMP"
bild& = @Create("HPIC", -1, name$)
neuerbutton&=@Create("PicButton",arbeitsleiste&,bild&,31,1,30,30,)
destroywindow bild&
Aufjedenfall solltest Du von solch grossen Arrays (9000!) Abstand gewinnen. |
| | | | |
| | GDL | Bin gerade dabei mir einen Bildcontainer mit festen Bildern zu machen und ändere die Verschiebetechnik dann ab. Komme dann mit 200 Bildern aus. KompilierenMarkierenSeparierennum1&=1
clear result%
whilenot num1& > objekt& Erzeugte Objekte abfragen
x%=1
y%=1
CheckMouse objekt_&[num1&],x%,y%,lang_&[num1&],breit_&[num1&]
If result% = 1
settext kfenster&,oname_$[num1&]
num&=num1&
clear result%
whilenot %Mousepressed = 0
UseCursor 3
destroywindow(objekt_&[num1&])
num&=num1&
settext kfenster&,oname_$[num1&]
xpos_&[num1&]=%mousex
ypos_&[num1&]=%mousey
xpos_1&[num1&]=%mousex+xbalken%
ypos_1&[num1&]=%mousey+ybalken%
ifnot ttext&[num1&]=1
objekt_&[num1&]=control("STATIC","",style_&[num1&],xpos_&[num1&],ypos_&[num1&],lang_&[num1&],breit_&[num1&],%hwnd,0,%hinstance,$0)
casenot left$(oname_$[num&],3)="Ger":Sendmessage(objekt_&[num1&],$172,0,bild_&[num1&]) hier werden die Pics momentan gebraucht
else
objekt_&[num1&]=create("text",%hwnd,oname_$[num1&],xpos_&[num1&],ypos_&[num1&],lang_&[num1&],breit_&[num1&])
setfont objekt_&[num1&],font&
endif
wend
UseCursor 0
Endif
num1&=num1&+1
wend
if %MouseKey=2
xn%=%mousex
yn%=%mousey
drawtext 10,%maxy-80,("aktuelle Erstellkoordinate: x "+right$(("00"+str$(%mousex)),3)+" y "+right$(("00"+str$(%mousey)),3))
endif
Es geht , muss nur die Objekterzeugung noch ändern.
Servus Georg |
| | | | |
|
AntwortenThemenoptionen | 1.925 Betrachtungen |
ThemeninformationenDieses Thema hat 4 Teilnehmer: |