Newsgroup: it.comp.lang.visual-basic
Titolo: Intercettare l'out of memory!!!

salve
come faccio ad intercettare l'errore 7 out of memory?
grazie!

 ha scritto nel messaggio
news:8tk60e$6q6$1...@fe1.cs.interbusiness.it...


> > come faccio ad intercettare l'errore 7 out of memory?
OUT OF MEMORY sotto Windows?
Come si fa ad andare in OOM con VB?
--
Fibia "Sakamoto" FBI
URL: 
www.geocities.com/fibiafbi
E-Mail: 
fibi...@hotmail.com
ICQ UIN 63586057


Se vuoi ti elenco un paio di metodi testati: quello classico è non
rilasciare oggetti/handle creati a runtime.
Ciao

 rilasciare oggetti/handle creati a runtime.
Si sono proprio curioso.
Anche se riempio un form con 200 RTFbox non puo' mangiarsi
tutta la memoria.
dopotutto winzozz se la swappa su hard disk.


Si sono proprio curioso.


 dopotutto winzozz se la swappa su hard disk.
Oggi ce l'ho con te.
Forse non sai che la "memoria" destinata all'allocazione degli
handle delle window in Win9x è di soli 64k (scarsi).
Lo swap della memoria su disco non conta niente.

Si sono proprio curioso.
Prova con questo:
Sono solo 4 chiamate.
Sono in un loop di 2000 iterazioni, vero, ma considera che potresti avere la
stessa situazione, magari con solo poche decine di iterazioni, ma che VB non
dealloca più questa memoria neanche se stoppi il programma (devi proprio
chiudere VB se non Windows)... ci vuole poco.
Sul mio 64MB + 8GB HD non riesco ad avviarlo più di una volta di seguito, e
sono strutture che occupano solo 28 * 2000 = 56000 byte.
Private Type POINTAPI
    x As Long
    y As Long
End Type
Private Type LOGBRUSH
    lbStyle As Long
    lbColor As Long
    lbHatch As Long
End Type
Private Type LOGPEN
    lopnStyle As Long
    lopnWidth As POINTAPI
    lopnColor As Long
End Type
Private Declare Function CreateBrushIndirect Lib "gdi32" (lpLogBrush As
LOGBRUSH) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hDC As Long, ByVal
hObject As Long) As Long
Private Declare Function CreatePenIndirect Lib "gdi32" (lpLogPen As LOGPEN)
As Long
Private Sub Command1_Click()
    Dim lb As LOGBRUSH
    Dim lp As LOGPEN
    Dim i As Long
    Dim hb As Long
    Dim hp As Long
    For i = 1 To 2000
        hb = CreateBrushIndirect(lb)
        hp = CreatePenIndirect(lp)
        Call SelectObject(hDC, hb)
        Call SelectObject(hDC, hp)
    Next i
End Su

 ha scritto


cioe' circa 16k finestre ?
in oe, con hysnap -> capture window, mi sembra di averne contate una
quindicina, inclusi i pulsanti chiudi delle cartelle e dei contatti.
16k non sono poche, comunque.

 16k non sono poche, comunque.
Occorre contare anche le risorse GDI impiegate.
Altri 64k (scarsi).
Queste tendono a scarseggiare anche prima.

 Queste tendono a scarseggiare anche prima.
il che porta alla solita domanda:
perche' in un sistema a finestre che, nel caso dei server, dovrebbe girare
in teoria ininterrottamente, non sono stati un po' piu' larghi ?
limiti hw o cosa ?

 limiti hw o cosa ?
"A chi mai potrebbero servire più di 640Kb di memoria?"
Ricordi la famosa sparata di Bill ?
Win9x è l'evoluzione di Win3.11. Si è portato dietro alcune
pecche concettuali di una certa rilevanza. Questa è una.
La cosa è stata "risolta" in WinNT, dove le risorse di
sistema non hanno questo limite.

oppure mettere l'istruzione on error resume next mi spiego meglio:
sub command1_click()
        on error resume next
        istruzioni varie che assegni tu
        if err.number = 7 then
            msgbox "out of memory",vbcritical,""
        end if
        on error goto 0 (alla fine)
end sub
Credo sia simile a quello che hai letto precedentemente, ma...è cmq un'altra
soluzione!!!!!!!


Ecco un altro sistema davvero carino appena scoperto:
    Dim b() As Byte
    Dim s As String
    b = StrConv(s, vbUnicode)
    s = StrConv(b, vbFromUnicode) '<<-- out of memory: non riesce a fare
l'operazione inversa con una stringa nulla!
Ciao

 MS sta riuscendo a convincere che gli win e' onnipotente?
Conosco anch'io l'instabile follia omicida di windows,
ma un sistema che si impalla non credo che sia dovuto
ad un'insufficiente memoria libera.
Personalmente non ho mai visto un "Memoria insufficiente" sotto
windows, eccetto che con un HD pieno.
In windows, e' noto: si impalla pure lo screen saver.


 Lo swap della memoria su disco non conta niente.
Ok. nulla da dire su questo. Tutto fila....
non so a voi, ma a me non e' mai successo che un programma
non si trovi un handlino libero.
dunque 65536 bytes / 4 bytes per puntatore = 16384 handles
16384 handles / 256 handle per finestra = 64 finestre.
256 = numero esageratamente grosso
senza contare che quasi tutte le risorse sono scaricate
automaticamente.
In un progetto quanti possono essere i controlli fatti a
runtime? 30? non credo che trenta combinino uno sfacelo...
... a meno che non uno non apra 20 sessioni dello stesso
programma.
Una parte delle 64 finestre sono desktop, traybar, porcate
nascoste. Ci rimangono una buona quarantina di finestre zeppe
di controlli.
Chi e' il folle che apre contemporaneamente tutta sta roba?
Si, e' possibile, ma a chi e' mai successo?
Ottimo prevedere, ma e' molto remoto.
Allora mi sembra il caso di prevedere la presenza di eventuali
cluster sul disco danneggiati per evitare di fargli scrivere i
dati dentro.
Ok, la prevenzione, ma....


 sono strutture che occupano solo 28 * 2000 = 56000 byte.
Ma il problema dov'e'?
Sono 2000 puntatori per un totale di 8000 bytes
sono 56000 bytes allocati
perche' se ne va in palla?
ho controllato il file di swap prima, durante e dopo l'esecuzione del detto
codice. non e' cambiato di 1 byte.
Perche' winzozzone non butta la roba che non puo' essere tenuta in
memoria nel file di scambio?
altrimenti a che serve?
Sarei grato a chi saprebbe illuminarmi


 Ricordi la famosa sparata di Bill ?
Ti amo zio Bill


> Ecco un altro sistema davvero carino appena scoperto:
Certo che e' fenomenale VB.
cmq avevate ragione... l'avevo sopravvalutato
--


 wrote in message
news:8trae0$42i$2...@lacerta.tiscalinet.it...


 dati dentro. Ok, la prevenzione, ma....
e -- info che mi incuriosisce assai -- ai cluster da vb come ci arrivi ?

 Sarei grato a chi saprebbe illuminarmi
(mi suona meglio: sarei grato a chi sapesse illuminarmi) -- non saro' certo
io quel tale, ma se, cosa di cui non dubito, la nota di jimi
sull'allocazione degli handle corrisponde a realta', sono gia' 56k su 64k,
non su n mb di swapfile... ti rimangono 8k, cioe' 2k handles. mi sa che se
dai un'occhiata al traybar, ai task nascosti, ai runonce e a
qualcos'altro...
pero', a pensarci:
jimi, se in nt la situazione e' diversa, il codice di zanna potrebbe in
teoria essere eseguito ripetutamente o la gestione handles e' la stessa che
in win9 ?


In winnt il codice di zanna fila liscio e pulito.
Tutte le volte che vuoi.
Ciaotutti,
Alessandro

 in win9 ?
In teoria dovrebbe funzionare fino all'esaurimento della memoria
fisica. Al momento di passare alla swap su file - se il programma
non cede il controllo al sistema durante una routine impegnativa
o se non ripulisce la memoria in maniera adeguata - quasi sicuramente
si genera un Out of Memory o un GPF (crash & dump) perché
NT non ha il tempo di allocare le risorse richieste.

 e -- info che mi incuriosisce assai -- ai cluster da vb come ci arrivi ?
non lo so, ma bisogna prevedere anche quello
Non ho lo spy a portata di mano, per cui ho provato ad aprire una
40ina di finestre e windows ha resistito.
il file di swap si e' gonfiato a 92 MB, ma il sistema ha resistito.
di contro dopo la loro chiusura, ho avviato un paio di programmi,
tra cui PCAnywhere e, solo soletto, si e' impallato KERNEL32


 di vari Gb.
In Win98 SE (sperimentato) sono riuscito ad ottenere un file di swap di 1,8
Gb
testando un programma che non rilasciava la memoria allocata, dopodichè
il programma stesso è stato terminato in quanto non c'era più spazio
disponibile
su HD. Il sistema alla fine recuperava la memoria ma non le risorse e
necessitava
quindi di essere riavviato.
In Win2k (e NT4), lo stesso programma, è stato terminato dal sistema dopo
circa 600Mb di swap file. Chiuso il programma il sistema tornava alle
condizioni
di partenza senza necessità di riavvio.
Byee
Zeross

In Win2k (e NT4), lo stesso programma, č stato terminato dal sistema dopo


 ha scritto nel messaggio
news:YQGL5.64985$3K3.2...@news.infostrada.it...
