Seite 3 von 5
Verfasst: 18.02.2006 00:42
von Falko
ts-soft hat geschrieben:Das Win98 nicht in der Lage ist, Resourcen richtig freizugeben, ist doch nun
bekannt. Dafür kann PB aber nichts! Entweder man schreibt seinen Code so,
das er Win98 tauglich ist oder man unterstützt das WinDOS nicht, sondern
nur ab Win2000.
Der einzige Bug ist Win9x
Schon mal WinNT4 getestet? Das ist noch älter als Win2K.
Kann aber auch sein, das mein Emulator auf XP-Speicher fixiert ist
MfG Falko
start
*MEM=8265160
*MEM=209584160
*MEM=398589984
*MEM=620625952
*MEM=846266400
*MEM=1072693280
*MEM=1298923552
*MEM=1524891680
*MEM=1749680160
*MEM=1969356832
*MEM=181665824
*MEM=403046432
*MEM=635043872
*MEM=863109152
*MEM=1090519072
*MEM=1316093984
*MEM=1544290336
*MEM=1774518304
*MEM=15597600
*MEM=248184864
*MEM=481099808
*MEM=707919904
*MEM=934019104
*MEM=1165361184
*MEM=1395327008
*MEM=1623523360
*MEM=1849622560
*MEM=92864544
...
Verfasst: 18.02.2006 00:56
von ts-soft
Und, was heißt das? Schafft er mehr oder weniger als WinDOS 98
Verfasst: 18.02.2006 01:10
von Falko
Wie lange würde der Code dauern? Wenn ich den durchlaufen lassen würde, dann bestimmt um das x-fache mehr als WinDOS 98, wenn du die Zeilen meinst. Ich hatte schon mal bis ca. 50Zeilen getestet und keinen Fehler erhalten.
Ist NT4 nicht älter als Win9x ?
MfG Falko
Verfasst: 18.02.2006 01:16
von ts-soft
Doch, aber hat ein wesentlich besseres Speichermanagment. Das von Win98
basiert ja auf reinem DOS. Win98 hat ja nicht zum Spaß von Stiftung
Warentest die Wertung "UNGENÜGEND" erhalten

Verfasst: 18.02.2006 01:38
von Toshy
Stiftung Warentest, die sollen mal lieber dabei bleiben Fußballstadion zu bewerten. *grins*
Ich glaube schon, daß die oft ihren Spaß haben.
Na ja, auf alle Bewertungen von denen sollte man nicht hören.
Stimmt natürlich das die NT-Schiene besser ist, besonders in der Speicherverwaltung, aber hier ist wenn dann nur ein kleiner Fehler PB oder Windows "vergißt" einfach das es den Speicher bereits freigegen hat. freigegeben ist er nämlich, auch die handles.
Langsam vermute ich zwar auch, das es an Window98 liegt (teste gerade die Apiaufrufe) aber verstehe so einiges am verhalten nicht.
Setzt mal in dem Code DIREKT NACH dem ersten und einzigen AllocateMemory() dies:
*MEM = ReAllocateMemory(*MEM, 1024*1024*32)
und dann klappt es. nicht nur das, auch sau schnell.
Langsam kann ich mir das nicht mehr erklären.
In dem Demo klappt es dann, aber ob das auch auf den realten Code bezogen klappt bezweifele ich.
Was mich auch wundert ist, das man zwar je Process 2 GB RAM nuten darf, aber pro Allocate(reAllocate) maximal den Physikalisch vorhanden Speicher als Maximum eingeben darf (be mir 256 MB). Die Auslagerungsdatei erweitert und erlaubt den Zugriff auf 2 GB pro Process, aber nicht pro AllociertenBerich!?
Jetzt stellt sich also die Frage WIE erfahre ich die Größe des verfügbaren Maximalen Speichers?
Verfasst: 18.02.2006 01:43
von Falko
@ts-soft
Stimmt genau. Daher hat Win2K und XP auf der Basis NT weiterentwickelt,
da viele Firmen ein verläßliches System haben mußten.
Hab mal das Testprogramm am laufen und immer noch keine Fehlermeldung.
Zwischenstand ist jetzt:
...
Ausgabe sekündlich | i=960384 | *MEM=875364384
Ausgabe sekündlich | i=960512 | *MEM=906100768
Ausgabe sekündlich | i=960640 | *MEM=936902688
Ausgabe sekündlich | i=960768 | *MEM=967704608
Ausgabe sekündlich | i=960896 | *MEM=998506528
Ausgabe sekündlich | i=961024 | *MEM=1029308448
Ausgabe sekündlich | i=961152 | *MEM=1060110368
Ausgabe sekündlich | i=961280 | *MEM=1090912288
Ausgabe sekündlich | i=961408 | *MEM=1121714208
Ausgabe sekündlich | i=961536 | *MEM=1152516128
...
PS: das "ü" habe ich aber manuel zugefügt, weil mir die DOS-Ausgabe das leider nicht anzeigt. Ein ue im source wäre vielleicht besser gewesen
MfG Falko
Verfasst: 18.02.2006 02:00
von ts-soft
Falko hat geschrieben:
PS: das "ü" habe ich aber manuel zugefügt, weil mir die DOS-Ausgabe das leider nicht anzeigt. Ein ue im source wäre vielleicht besser gewesen
MfG Falko
Code: Alles auswählen
Procedure.s PrintX(Text.s)
CharToOem_(@Text, @Text)
ProcedureReturn Text
EndProcedure
OpenConsole()
PrintN("start") : Debug "start"
*MEM = AllocateMemory(16)
*MEM2
StartTime.l
For i = 1 To 800000*1000
If ElapsedMilliseconds()-StartTime > 1000
PrintN(PrintX("Ausgabe sekündlich | i="+Str(i) +" | *MEM=" + Str(*MEM ) ))
Debug "*MEM=" + Str(*MEM )
StartTime = ElapsedMilliseconds()
EndIf
*MEM2 = *MEM
Repeat
*MEM = ReAllocateMemory(*MEM2, 32*i) ; man kann auch nur "i" nehmen
If *MEM = 0
PrintN("_ReAllocateMemory()-Error | i=" + Str(i) + " | Size=" + Str(32*i) + " | *MEM2=" + Str(*MEM2) )
Debug "_ReAllocateMemory()-Error | i=" + Str(i) + " | Size=" + Str(32*i) + " | *MEM2=" + Str(*MEM2)
Delay(5000)
EndIf
Until *MEM <> 0
Next i
PrintN("ende") : Debug "ende"
For i = 1 To 600
Delay(100)
Next i
CloseConsole()

Verfasst: 18.02.2006 02:01
von Toshy
Tja,
es scheint doch WIndows98 zu sein, aber das sollte unbedingt wenn Fred das bestätigt mit in die Hilfe, den es betrifft ebenso Linkedlisten (vermutet) und Arrays (getestet).
Eine Array das man in der Größe auf die selbe art ändert crasht auch sofort. Dynamische Speicherverwaltung ist unter WIndows98 anscheindend gar nicht sicher möglich. Da müßte man komplett alles selber machen (gesamten RAM reservieren und dann selbst vergeben, natürlich auf den Process beschränkt.)
Code: Alles auswählen
OpenConsole()
PrintN("start") : Debug "start"
StartTime.l
For i = 1 To 800000 ;*1000
Dim MyArray.l(i,32)
If ElapsedMilliseconds()-StartTime > 1000
PrintN("1/Sek.| i="+Str(i)+" | @MyArray()="+Str(@MyArray()) )
StartTime = ElapsedMilliseconds()
EndIf
If @MyArray() = 0
PrintN("_ReAllocateMemory()-Error | i=" + Str(i) )
Debug "_ReAllocateMemory()-Error | i=" + Str(i)
Debug GetLastError_()
Delay(5000)
EndIf
Next i
Debug i
PrintN("ende") : Debug "ende"
For i = 1 To 600
Delay(100)
Next i
CloseConsole()
Verfasst: 18.02.2006 02:01
von Falko
Friedrichs hat geschrieben:...
Jetzt stellt sich also die Frage WIE erfahre ich die Größe des verfügbaren Maximalen Speichers?
Hab's mal aus Droopy's Codeschnipsel extrahiert. Da dort ein API-Aufruf
ist wirds nicht direkt unter der Demoversion laufen.
Code: Alles auswählen
Structure MEMORYSTATUS
dwLength.l
dwMemotyLoad.l
dwTotalPhys.l
dwAvailPhys.l
dwTotalPageFile.l
dwAvailPageFeile.l
dwTotalVirtual.l
dwAvailVirtual.l
EndStructure
Procedure _GlobalMemoryStatusTotalPhys()
Memory.MEMORYSTATUS
GlobalMemoryStatus_(@Memory)
ProcedureReturn Memory\dwTotalPhys /1024/1024
EndProcedure
Debug _GlobalMemoryStatusTotalPhys()
Verfasst: 18.02.2006 02:14
von Falko
Danke ts

War aber trotzdem nicht mein Schreibfehler
@Friedrichs
Dann probier mal den Spass mit den Druckereinstellungen in Windoof98
aus. Da muss man eben alles umständlicher machen als unter XP.
Ebenso gibt es Unterschiede bei den Movie-Funktionen, wenn man
Fotos aus einem Film heraus machen will.
Viele Fehler liegen im Windoofen verborgen, darum ist es schwierig zu
sagen ob dieses oder jenes ein Bug ist.
Ich kann mir sehr gut vorstellen, wie Fred schwitzt um es unter
allen Plattformen anzupassen .
