Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve
Dopo quasi un mese di utilizzo quotidiano e un viaggio medio-lungo in autostrada, raccontiamo pregi e limiti della Geely EX5: comfort premium, batteria LFP da 60,22 kWh, autonomia fino a 430 km e un prezzo che parte da 38.900 €
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare
Mova Z70 Ultra Complete è un robot aspirapolvere che coniuga un'aspirazione potente e un lavaggio con rullo a logica di intelligenza artificiale che guida al meglio nella pulizia di casa: rulli e spazzole estensibili a pulire gli angoli e una base di ricarica che lava e ripristina il robot al emglio delle sue funzionalità dopo ogni azione di pulizia
Recensione Google Pixel 11: non ha l'HiLight dei Pro, ma è il Pixel più equilibrato di sempre
Recensione Google Pixel 11: non ha l'HiLight dei Pro, ma è il Pixel più equilibrato di sempre
Abbiamo provato Google Pixel 11, il più accessibile della nuova gamma: chip Tensor G6 condiviso con i modelli Pro, fotocamera 48 MP con Magic Capture e Stili Fotografici, display Actua da 3000 nit e batteria da 4985 mAh. Ecco come si comporta nell'uso quotidiano, e cosa cambia davvero rispetto a Pixel 11 Pro e Pro XL
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 28-11-2001, 14:58   #1
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
una domanda su: FreeLibrary(...)

Ho notato che se si scrive una funzione del tipo:


a) apri la libreria
b) se ok trova la funzione in essa
c) se trovata usa la funzione
d) quindi chiudi e libera la memoria allocata dalla libreria


bene, richiamando + volte la medesima funzione dall'interno di un'altra funzione (oops che ripetitivo) la memoria non viene liberata, come se la chiamata FreeLibrary(); non esistesse.

domanda:

vi risulta che sia Windows a comportarsi così?
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 28-11-2001, 15:52   #2
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Se la funzione di libreria alloca memoria, tu la liberi e non vedi comunque diminuire la memoria occupata dal processo, ciò può essere dovuto a una frammentazione della memoria hash del processo. La memoria rimane disponibile nell'hash, ma esso presenta parecchi "buchi liberi" (in genere più piccoli di 4k - la dimensione di una pagina di memoria) e non può quindi essere ridotto restituendo a Windows la memoria non più utilizzata. Mi è capitato una volta un problema simile, con il Delphi, e credo sia dovuto a un non perfetto riutilizzo dell'hash da parte delle librerie di gestione della memoria della VCL. Ovviamente se la funzione alloca memoria e tu ti "scordi" di liberarla è un altro discorso (questo non te lo fa la FreeLibrary )
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 28-11-2001, 16:01   #3
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
(oops per hash voledvo dire heap, ovviamente)
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 28-11-2001, 16:35   #4
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
+ tardi posto un esempio di 2 metodi
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 28-11-2001, 19:38   #5
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
primo esempio mangia memoria


//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
for (int i =0; i <FileListBox1->Items->Count; i++)
Image2->Picture->Bitmap->Handle = MyLoadPic(FileListBox1->Items->Strings[i].c_str(),false);
}
//---------------------------------------------------------------------------
HBITMAP TForm1::MyLoadPic(char *filename, bool Progressflag)
{
typedef HBITMAP (__stdcall *IMPPROC) (char *, bool);
IMPPROC ImpFunc;
HINSTANCE DllInstance;
HBITMAP ritval;

DllInstance=LoadLibrary("NViewLib.dll");
if(DllInstance != NULL){
ImpFunc =(IMPPROC) GetProcAddress(DllInstance,"NViewLibLoad");
if(ImpFunc != NULL) {
ImpFunc(filename,Progressflag);
ritval = ImpFunc(filename, Progressflag);
}
else {
ShowMessage("Funzione non trovata");
}
FreeLibrary(DllInstance);
}
else
ShowMessage("Manca la Libreria NViewLib");

return ritval;
}
//---------------------------------------------------------------------------
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 28-11-2001, 20:33   #6
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Non conosco l'oggetto HBITMAP, ma a naso direi che è un handle implementato come un puntatore all'oggetto vero e proprio o qualcosa di simile, oggetto che viene allocato dalla funzione stessa della libreria. Se è così, chi lo distrugge quando non è più necessario?
Cmq (mi sembra che stai usando il Borland) se spulci tra i metodi di TImage o classi ereditate, mi sembra di ricordare che ci sia una sorta di LoadFromFile (forse tra i metodi del TCanvas o TBitmap?)
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 28-11-2001, 20:35   #7
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
conosco quanto mi dici ma ho bisogno di usare una DLL esterna in quanto mi permette di visualizzare una marea di formati grafici; caratteristica non presente in BCB.
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 28-11-2001, 20:49   #8
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Immaginavo
Cmq gli oggetti HBITMAP _devi_ distruggerli manualmente quando non sono più necessari con DeleteObject (ho dato un'occhiata alla guida Win32)
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 28-11-2001, 21:00   #9
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
sob, ma se io utilizzo sempre lo stesso oggetto....

ho provato ad allocare dinamicamente TImage *Image = new.... e subito dopo a distruggerlo con delete ..... ma il risultato non cambia.

Il risultato cambia se apri la libreria una sola volta, usi la funzione di lettura quanto vuoi, quindo la chiudi.

In questo ultimo caso puoi aprire tutte le immagini che vuoi e lo spreco di memoria è minimo.

Quindi il problema è:

perchè se chiamo la funzione esternamente la memoria occupata si incrementa ad ogni ciclo del (for...)

mentre se inserisco lo stesso ciclo all'interno della funzione lo spreco di memoria non esiste?

Non è che windows con l sue maledette predizioni si rifiuta di deallocare fino a quando non esco dall'aplicazione?
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 28-11-2001, 21:13   #10
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Cioè: vuoi dire che così non hai problemi?

void __fastcall TForm1::Button1Click(TObject *Sender)
{
HINSTANCE DllInstance = LoadLibrary("NViewLib.dll");
IMPPROC ImpFunc = (IMPPROC) GetProcAddress(DllInstance,"NViewLibLoad");
for (int i =0; i <FileListBox1->Items->Count; i++)
Image2->Picture->Bitmap->Handle = ImpFunc(FileListBox1->Items->Strings[i].c_str(),false);
FreeLibrary(DllInstance);
}
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 28-11-2001, 21:30   #11
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
azz....sei un gallo proprio così; riposto il codice della seconda soluzione, quella che non spende memoria solo perchè l'ho testato con successo:

l'unica differenza è che non riesco a piazzare il codice di ritorno della funzione per studiarne il valore e comportarmi di conseguenza.
Il secondo metodo qui e da te postato ha lo svantaggio che se mi serve la stessa funzione in altre parti devo riscriverla per (n) volte.

Dov'è il mistero?

se hai voglia prova, vedrai che è così......ho idea ma è solo una mia supposizione che ci sia lo zampino di windows...predizioni...mah...



//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
typedef HBITMAP (__stdcall *IMPPROC) (char *, bool);
IMPPROC ImpFunc;
HINSTANCE DllInstance;

DllInstance=LoadLibrary("resource\\NViewLib.dll");
if(DllInstance != NULL){
ImpFunc =(IMPPROC) GetProcAddress(DllInstance,"NViewLibLoad");
if(ImpFunc != NULL) {

for (int i =0; i <FileListBox1->Items->Count; i++)
Image2->Picture->Bitmap->Handle = MyLoadPic(FileListBox1->Items->Strings[i].c_str(),false);

}
else {
ShowMessage("Could not find a function");
}
FreeLibrary(DllInstance);
}
else
ShowMessage("Could not load library");
}
//---------------------------------------------------------------------------
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 28-11-2001, 21:51   #12
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Al di là di tutto, però, questa riga mi sembra dubbia:
Quote:
for (int i =0; i <FileListBox1->Items->Count; i++)
Image2->Picture->Bitmap->Handle = MyLoadPic(FileListBox1->Items->Strings[i].c_str(),false);
Cioè: sovrascrivi Image2->...->Handle con FileListBox1->...->Count valori diversi...perchè?
E comunque quelli precedenti li devi deallocare con DestroyObject
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 28-11-2001, 21:58   #13
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
no no, non dealloco nulla e funziona benisimo ma....non so perchè...

cmq, continuo a sovvrascrivere
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 29-11-2001, 07:47   #14
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Al di là di questo, alla fine del ciclo for in Image2->...->Handle ti ritrovi l'handle dell'ultima immagine caricata...e le precedenti?
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 29-11-2001, 08:43   #15
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
no, ne rimane uno solo, almeno credo

forse ad ogni assegnamento la VCL distrugge l'oggetto automaticamente per ricrearlo ex novo solo se il loop è all'interno della funzione di apertura/chiusura della DLL


anche così non si risolve nulla:

for (int i =0; i <FileListBox1->Items->Count; i++)
{
Image = new TImage(Form1);
Image->Picture->Bitmap->Handle = MyLoadPic(FileListBox1->Items->Strings[i].c_str(),false);
delete Image;
}
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 29-11-2001, 09:30   #16
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
correggo, l'Handle cambia ogni volta.....

ho caricato con il metodo sopra (n) immagini per un totale di 68Mb; bene, la memoria di sistema occupata al termine dell'ultima immagine era di 68Mb.....roba da matti......

possibile che anche:

TImage *Image = new ......

e poi

delete Image

non funzioni?
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 29-11-2001, 10:08   #17
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
usando la LoadFromFile di BCB, e sovvrascrivendo, tale funzione spreca solo la memoria di una immagine alla volta.

Io mi domando come sia strutturata tale funzione....boh...
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 29-11-2001, 10:12   #18
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Mi sta sorgendo il dubbio che sovrascrivere l'Handle della Bitmap di TImage sia una procedura scorretta. Comunque prova a fare così:
{
DestroyObject(Image->Picture->Bitmap->Handle);
Image->Picture->Bitmap->Handle = MyLoadPic(filename,false);
}
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 29-11-2001, 11:15   #19
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
niente da fare, lo spazio occupato è ancora la somma di tutte le immagini lette.

Bisognerebbe conoscere come fa LoadFromFile.


Ho provato anche così ma niente, medesimo risultato

TPicture *MyPicture;

for (int i =0; i <FileListBox1->Items->Count; i++)
{
MyPicture = new TPicture();
MyPicture->Bitmap->Handle = MyLoadPic(FileListBox1->Items->Strings[i].c_str(),false);

MyPicture->Free();

}

anche con

Image->Destroy();

nulla da fare
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 29-11-2001, 19:33   #20
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
.
misterx è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
Recensione Google Pixel 11: non ha l'HiLight dei Pro, ma è il Pixel più equilibrato di sempre Recensione Google Pixel 11: non ha l'HiLight dei...
Google Pixel 11 Pro XL: fotocamera al top, batteria indietro. Luci e ombre del nuovo flagship Google Pixel 11 Pro XL: fotocamera al top, batte...
Non sai programmare? Ecco cosa si può fare con un LLM e una GeForce RTX 5070 Ti Non sai programmare? Ecco cosa si può far...
Denza Z arriva nelle concessionarie in C...
NVIDIA investe 3,5 miliardi in MediaTek:...
Amazon: mentre l'azienda licenzia i dipe...
CATL, allarme esposizione nichel nello s...
Web moderno e privacy: l'evoluzione di i...
LG presenta ThinQ Claw, il chatbot per l...
Anthropic avvisa di furto di sessioni su...
The Elder Scrolls 6: Asha Sharma 'svia' ...
Niente RGB, più attenzione alle l...
LUMI-AI, l'Europa investe 387,8 milioni ...
CXMT pronta a entrare nella storia delle...
Google Maps ha cambiato il nome a uno de...
Bitcoin, la prima transazione resistente...
GTA 6 è in sviluppo dal 2015, ma ...
BYD vola all'estero: l'export a +68%, e ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 14:17.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v