Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Come suggerito da Nessuno, ripropongo qui il mio quesito:
Testo quotato
Mi succede una cosa strana...
Ho uno dei miei pasticciatissimi programmi in fase di "elaborazione", e mi ritrovo a voler caricare delle immagini con Gdiplus per mezzo di new Image(L"nomefile"). Controllo tutto il controllabile e, quando è il caso, distruggo regolarmente con delete l'oggetto Image creato.
Tutto funziona alla perfezione finché... incredibile... chiamo GetOpenFileName() o GetSaveFileName()! A quel punto sembra che GDI impazzisca. Dal task manager rilevo che le due funzioni creano una sessantina di oggetti GDI che non vengono distrutti che in minima parte, e le mie successive chiamate a new Image(L"nomefile") falliscono miseramente con GetLastStatus() che restituisce OutOfMemory (il che, francamente, mi sembra assurdo perché il task manager mi informa che sono ancora disponibili circa 1,3 GB di memoria fisica liberi).
Qualcuno qui ha idea di cosa sta succedendo? Perché ho già provato qualsiasi verifica col debugger e non trovo nessun altro errore. Dico nessuno. Sono evidentemente cieco, oppure è il sistema che fa cose strane (probabilmente perché m'è sfuggito qualche passaggio della documentazione, che pure ho letto e riletto non so quante volte)...
I problemi si manifestano esclusivamente dopo la chiamata a GetOpenFileName() o a GetSaveFileName() in questa funzione (cancellando le chiamate al sistema, la funzione non dà inconvenienti):
Prima che qualcuno faccia questa ipotesi, evidenzio subito che non ho commesso errori usando stringhe di WCHAR al posto di stringhe di char, anche perché il nome del file che ricavo con IdentificaFile() non lo uso con Gdiplus (e comunque il compilatore sputerebbe fuori segnalazione d'errore a raffica).
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
La funzione nella quale Gdiplus segnala i suoi OutOfMemory (solo nelle condizioni che ho già spiegato) è questa:
Codice sorgente - presumibilmente C++
Image *CaricaSprite(const WCHAR *nome_file ){
try{
Image *imgTmp =new Image( nome_file );
if( imgTmp->GetLastStatus()!= Ok )
{delete imgTmp; imgTmp =NULL;}
return imgTmp;
}catch( ... ){
returnNULL;
}
}
Il parametro nome_file viene sempre ed esclusivamente passato ricavandolo da una di tre costanti WCHAR[], per cui NON PUO' interferire con il nome del file passato da IdentificaFile().
Ultima modifica effettuata da AldoBaldo il 15/10/2017 alle 14:33
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
di cui non capisco il perché della grandezza e sperando che la stessa venga liberata dalla funzione chiamante, non trovo particolari problemi (io avrei usato stringhe del C++, ma non p questo il problema) ...
L'ho usata, anche con GDI+ e non mi ha dato problemi.
Quindi il problema è nella sua chiamata o da qualche altra parte.
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
Per la precisione ho scritto un piccolo main con questi blocchi
- startup di GdiPlus (obbligatorio)
- chiamata a IdentificaFile
- chiamata a CaricaSprite (con costante)
- visualizzazione (con graphics.DrawImage)
- shutdown di GdiPlus (obbligatoria)
e non ho avuto problemi.
Ultima modifica effettuata da nessuno il 15/10/2017 alle 15:29
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
Il 4x è giusta una fisima, diciamo un eccesso (inutile) di prudenza. Mi basta poco per avere quel senso di tranquillità che ti aggiusta una mezz'ora.
Sai che faccio, a questo punto? Apro un progetto qui su Pierotofy così carico tutto il programma e magari vedendo l'insieme (se ne hai voglia) scopri l'inghippo. A me continua a sfuggire.
P.S. Ora ne provo un'altra, che sembra stupida: riavvio il PC e vedo che accade. Hai visto mai...
Ultima modifica effettuata da AldoBaldo il 15/10/2017 alle 20:32
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
E' una fisima inutile ... devi programmare con criterio, sapendo quello che fai ...
Per il progetto, va bene, ma indica anche dove si presenta il problema nel codice.
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.