Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: Diego1981 - Febbraio 12, 2016, 08:45:20 am

Titolo: Errore Multithread
Inserito da: Diego1981 - Febbraio 12, 2016, 08:45:20 am
Ciao Ragazzi
nella mia applicazione creo una serie di thread , circa una decina, dove ogni thread corrisponde ad un timer;ogni tanto ma non sempre mi restituisce un errore
"Thread creation error:Memoria insufficiente per eseguire il comando"
Visto che la cosa è saltuaria non riesco a capire l'errore e pensavo che magari qualcuno avesse una dritta da darmi.
Grazie
Titolo: Re:Errore Multithread
Inserito da: xinyiman - Febbraio 14, 2016, 09:46:56 am
Ciao ti consiglio di mettere dei try in ogni funzione e salvare un log dell'errore da qualche parte e poi analizzi. Diversamente dalle info che hai dato non è possibile capire molto
Titolo: Re:Errore Multithread
Inserito da: Diego1981 - Febbraio 14, 2016, 10:30:27 pm
ciao xiny
il blocco è già in un blocco try-except e non mi dice nulla di più di quanto scritto comunque cerco di vedere se posso approfondire come dici tu
grazie
Titolo: Re:Errore Multithread
Inserito da: bonmario - Febbraio 15, 2016, 08:02:02 am
A me capitò la stessa cosa e, se non ricordo male, alla fine si trattava di un memory leak: di un oggetto non facevo la "free + nil" alla fine del suo utilizzo e, dopo un po' di tempo, mi dava quell'errore.
Io mi ero reso conto della cosa tenendo sotto occhio il mio applicativo da "gestione risorse", dove vedevo che più passava il tempo, più mi occupava memoria.

Ciao, Mario
Titolo: Re:Errore Multithread
Inserito da: Diego1981 - Febbraio 17, 2016, 10:07:00 pm
Ciao Mario
proverò a tenere sott'occhio la memoria del processo ma il freeandnill lo faccio alla fine dell' execute del thread.
Ti posto il codice cosi magari imparo qualcosa  ;D
Alla fin fine il thread non è altro che un conto alla rovescia

procedure TimerThread.Execute;
var
  i:Integer;
begin
  attesa:=attesa*1000;
  i:=1000;
  repeat
    Sleep(1000);
    i:=i+1000;
    if i=attesa then
      interrompithr:=True;
  until interrompithr=True;
    if SpegniOut then
      FR_Principale.ElabThread.AttDisOutDg(noutcom,'00');
  FreeAndNil(FR_Principale.TimerOff[noutcom]);
end;

ovviamente accetto critiche
grazie
Diego
Titolo: Re:Errore Multithread
Inserito da: bonmario - Febbraio 18, 2016, 07:58:25 am
Ciao,
intendevo "qualche oggetto" in generale, non per forza l'oggetto del thread, magari qualcosa che chiami al suo interno, ad esempio dalla "FR_Principale.ElabThread.AttDisOutDg".
Pensa che nel mio caso la colpevole era una procedura creata 3 o 4 anni prima, che nei miei test dei thread andavo a chiamare migliaia di volte, cosa che fino a quel momento non mi era mai capitato di fare !!!

Ciao, Mario
Titolo: Re:Errore Multithread
Inserito da: SB - Febbraio 21, 2016, 08:27:30 am
      FR_Principale.ElabThread.AttDisOutDg(noutcom,'00');
  FreeAndNil(FR_Principale.TimerOff[noutcom]);

Se ho capito bene, da un thread invochi un metodo di un oggetto (globale?) e poi distruggi un altro oggetto (globale?)...
Mi sembra una gran brutta cosa... sei fortunato che di norma funzioni...
Tutto dipende da come hai scritto il codice rimanente, ma secondo me per principio dovresti isolare un po' meglio i thread.

Titolo: Re:Errore Multithread
Inserito da: Stilgar - Marzo 05, 2016, 01:25:39 am
Ciao. Ti conviene mettere quello.che crei a distruggi dentro il thread o semaforizzare l'accesso a risorse (puntatori) esterni al thread. Come principio.
Se il thread di serve come "linea di ritardo" cerca altre strade. Un timer è più che sufficiente. Se è un tool solo per Windows quello.che stai scrivendo, pensa alla api di winzoz. Waitobjet (vado a memoria) dovrebbe essere più che sufficiente 😊
Stilgar