Newsgroup: it.comp.lang.delphi
Titolo: insufficient memory

Sono alle prese; e sono molto preoccupata, con questo tipo di errore.
Sospetto che a fare crescere in modo errato e continuo  la quantità di
memoria usata sia
un gruppo di mie funzioni in cui viene spesso usato un oggetto di tipo
TQuery che, passato com VAR viene poi inizializzato in una funzione che mi
gestisce la query a cui passo inoltre
   // - p_qry: Query da creare
   // - p_db : DataBase associato
   // - p_textqry: Testo della query da eseguire
   // - p_mod: 'O': devo fare la Open - 'E': devo fare ExecSql
   // - p_upper: se devo fare o meno uppercase del testo della query
   // - p_update: se devo aggiornare la query temporanea
function Qry_Temp(var p_qry: TQuery; p_db,p_textqry,p_mod:
string;p_upper,p_update: boolean): boolean;
var w_res: boolean;
      w_db: TDataBase;
begin
  p_qry := TQuery.Create(nil);
  p_qry.close;
   w_db := _DB(p_db);
   p_qry.DatabaseName := w_db.DatabaseName;
   if p_update then
   begin
     p_qry.AutoCalcFields := true;
     p_qry.AutoRefresh    := false;
     p_qry.CachedUpdates  := false;
     p_qry.Constrained    := false;
     p_qry.UniDirectional := false;
     p_qry.UpdateMode     := upWhereAll;
     p_qry.RequestLive    := true;
   end;
   p_qry.sql.clear;
   if p_upper then
     p_textqry := UpperCase(p_textqry);
   p_qry.SQL.add(p_textqry);
   w_res := True;
   if p_mod = 'O' then       // Modalità Open
     try
       p_qry.open;
     except
       on  E: Exception do begin ShowMessage(E.Message);
       p_qry.close;
       w_res := False;
       end;
     end
   else
   if p_mod = 'E' then       // Modalità ExecSql
   begin
     try
       p_qry.ExecSql;
     except
       w_res := False;
     end;
     // Nel caso di ExecSql, non ho + bisogno della qry in uscita
     // Libero la query
     FreeAndNil(P_qry);
   end
   else
     w_res := False;
Quando ho finito di usare tale query temporanea uso FreeAndNil(query)
vi sarei estremamente grata se mi comunicaste se e dove sbaglio....
cosa posso fare per liberare la memoria allocata????
Grazie
Ste

Ciao Stefania
Ti rispondo senza aver studiato a fondo il codice...
ma perche' passi un TQuery come var se poi lo crei e lo distruggi
nella procedura stessa?
In Delphi, inoltre, le classi sono gia' passate per riferimento...
non so se anche questo puo' dare fastidio ma io controllerei meglio
Ciao
Mirko

Ciao, io ho avuto un problema credo analogo: per select con enormi quantità
di record ritornati (circa 1'000'000) avevo un incremento di 400k/sec. della
memoria utilizzata fino ad avere errori del tipo "low on virtual memory".
Leggendo cosi' la function non e' semplicissimo valutare se il problema e'
simile o meno: quando esattamente ti si presenta il problema? Nelle update
e/o nelle select o sempre? Sei riuscita a capire quale "istruzione" fa
incrementare la memoria?
Ad esempio avevo notato che l'incremento della memoria era al "next".
Il metodo che io ho usato per risparmiare sensibilmente la memoria del
client (oltre a numerose ottimizzazioni) e' stato quello di settare
UniDirectional := false. In questo modo evita di farti la cache dei record
precedenti. In realta' non so se nel tuo caso ci siano "controindicazioni".
Sappimi dire, ma in questo modo eventuali select non incrementano piu' la
quantita' di memoria utilizzata.
HTH,
Gianni
"Stefania" <XXXXs...@fisquick.itXXXX> ha scritto nel messaggio
news:a42kfb$15ju6$1...@news02.it.net...


Ciao Stefania.
Secondo me il problema è che se la query di tipo Open allora
non chiami il FreeAndNil.
Ciao, Rocco

Scusami se sono drastico, ma io creerei 2 procedure.
Una che ti restituisce la query che ti serve ed un altra
che ti fa la execsql e poi te la libera.
Questo codice è complesso da leggere e da mantenere.
La funzione va 2 operazioni diverse che credo possano essere
ditinte a monte, risparimiando il passaggio del parametro
aggiuntivo che indica se usare Open o ExecSql.
Nota che adesso che hai un problema e devi eseguire un debug finisci
nei casini.
Quindi il mio consiglio è crearne 2, una che ti ritorna la query
che hai creato, l'altra che esegue ExecSql.
Inoltre lascerei perdere il requestlive e userei un TUpdateSql.
Se hai proprio la necessità di avere un unico nome puoi
usare un overload e via.
Bye
AS
"Se è Microsoft non funziona"
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 ha scritto nel messaggio
news:45080da79d30e7ac49...@mygate.mailgate.org...


Salve vi ringrazio per l'interessamento.
Poichè sono proprio alle prime armi vorrei capire come posso circoscrivere
il problema e capire cosa mi causa questo innalzamento della memoria.
Premetto che uso un progetto con un exe e che la funzione di cui mi servo
per creare le query ed interagire con i database in generale si trova in
Dll.
Cosa devo usare per farmi indicare il livello di memoria??? Uso il monitor
di sitema e/o il misuratore delle risorse, ma per agire con indicatori da
Delphi cosa posso usare???
Grazie
Ste

 senso.
Confermo.
Ma la prima strada x semplificare la ricerca di errori sta nella
scrittura di codice leggibile e facile da mantenere.


 Delphi cosa posso usare???
Prima di usare questi strumenti, comincia con lo spezzare in 2 parti
ņa tua funzione: una che ti ritorna la query ed una che ti esecue 
ExecSql senza ritornarti la query.
Una funzione per uno scopo
Uno scopo per ogni funzione.
In questo modo riesci a capire quale tra le 2 funzioni
ti fa il casino.
Dopo, puoi usare varie tecniche per capire il xche.
Bye
AS
"Se č Microsoft non funziona"


 wrote in message
a62a8fc5c6b007d7fd...@mygate.mailgate.org...


il problema e capire cosa mi causa questo innalzamento della memoria.
Ciao Stefania.
Come ti ho già scritto nel mio primo post (forse puo' esserci qualche
problema con il news server) secondo me il problema è che se la query
è di tipo 'O' (quindi devi fare l'open) non fai la free della query
stessa (infatti il free è nel blocco che esegue una query di
update/insert).
Ciao, Rocco.

Ciao Stefania,
so che esistono tools che possono aiutarti a testare l'utilizzo della
memoria: uno di questi è "memory sleuth". Mi hanno detto che era distribuito
assieme a Delphi, ma nel mio cd di  D5 non c'è. Puoi dare un'occhiata tra i
tools per Delphi in
http://www.borland.com/delphi/resources/deltools.html
.
Io comunque, a suo tempo, scelsi una soluzione piu' "artigianale": tenevo
task manager aperto sotto "performance" mentre facevo il debug con
pazienza... E' una rottura, ma la soluzione e' immediata, efficace e non
devi acquistare o scaricarti nulla...
Gianni
"Stefania" <XXXXs...@fisquick.itXXXX> ha scritto nel messaggio
news:a48tnm$1epqr$1...@news02.it.net...
