Autore Topic: Forzare la liberazione della memoria occupata da un oggetto  (Letto 851 volte)

Offline therock892

  • Gamberetto
  • *
  • Post: 6
    • Mostra profilo
Mi piacerebbe sapere se esiste un modo in Gambas per liberare, in particolare, la memoria occupata dagli oggetti Image.

Mi spiego meglio; ho notato che con le applicazioni Gambas, che usano Gtk, è presente un bug con gli oggetti Image e Picture che si presenta quando vengono caricate immagini senza Alpha Channel.

Quando si caricano queste immagini ad es in una PictureBox tramite variabili locali..queste rimangono in eterno in memoria, portando alla saturazione della memoria RAM! :hatecomputer:

Leggendo le note di rilascio di Gambas 3.5.2 sembra che da quella versione il bug sia stato risolto, anche se non l'ho testato personalmente  :)

Il mio problema è che io avrei la necessità di fare girare correttamente i miei programmini, anche sulle versioni precedenti di Gambas con le Gtk!  :'(

Vi lascio un codice di esempio che mette in evidenza il problema, (basta trascinare una immagine sulla PictureBox per vedere dal Monitor di sistema il processo gbx3 schizzare tra i primi posti come memoria occupata! :-P)

Codice: vb [Seleziona]

Public Sub Form_Open()
 
  PictureBox1.Drop = True
 
End

Public Sub PictureBox1_Drop()
 
  Dim image_file As Image 
  Dim images_file_drop As String[]
  Dim image_file_drop As String
  Dim i As Integer
 
  images_file_drop = Split(Drag.Data, "\r\n", "", True)
 
  For i = 0 To 30
     
    For Each image_file_drop In images_file_drop
     
      image_file_drop = Right(image_file_drop, Len(image_file_drop) - 7)
      image_file = Image.Load(image_file_drop)
      PictureBox1.Picture = image_file.Picture
     
    Next
   
  Next
 
End

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.269
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Forzare la liberazione della memoria occupata da un oggetto
« Risposta #1 il: 24 Marzo 2014, 11:41:17 »
(basta trascinare una immagine sulla PictureBox per vedere dal Monitor di sistema il processo gbx3 schizzare tra i primi posti come memoria occupata!

Ho effettuato la prova da te suggerita (io ho la versione Gambas 3.5.2). Lanciando l'eseguibile del tuo codice, a me occupa 4,2 Mb di memoria, posizionandosi al 9° posto fra i processi più... "memorivori". Se vi trascino, poi, un'immagine, il processo va ad utilizzare 5,2 Mb di memoria passando soltanto all'8° posto.
« Ultima modifica: 24 Marzo 2014, 11:43:21 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: Forzare la liberazione della memoria occupata da un oggetto
« Risposta #2 il: 24 Marzo 2014, 13:01:21 »
Citazione
Il mio problema è che io avrei la necessità di fare girare correttamente i miei programmini, anche sulle versioni precedenti di Gambas con le Gtk!  Pianto

perchè insistere con le gtk?  ... utilizza qt4  ;D

Offline therock892

  • Gamberetto
  • *
  • Post: 6
    • Mostra profilo
Re: Forzare la liberazione della memoria occupata da un oggetto
« Risposta #3 il: 24 Marzo 2014, 16:03:35 »
vuott la prova che hai fatto mi dà la conferma che hanno risolto il bug.
Peccato che io debba farlo girare su versioni più vecchie..adesso io stò usando la 3.1.1.

Boh ho provato ad usare anche il metodo Image.Flush che dovrebbe eliminare la cache dell'immagine ma non cambia niente..

Sono avvilito..mi sà che mi tokkerà passare alle Qt..peccato preferivo le Gtk  ;D

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Forzare la liberazione della memoria occupata da un oggetto
« Risposta #4 il: 24 Marzo 2014, 17:13:23 »
Sono avvilito..mi sà che mi tokkerà passare alle Qt..peccato preferivo le Gtk  ;D

È una delle prime cose che fanno tutti qui. Le GTK soffrono di troppi bug e ti ritrovi molto spesso a perdere troppo tempo dietro i bug prima di capire che è colpa dell'implementazione delle GTK. Effettua uno switch verso le Qt e basta.