Newsgroup: it.comp.lang.delphi
Titolo: Passare variabili Thread --&gt;Main

Vorrei avere qualke conferma dato che non riesco a trovarla.
Premessa: Ho 2 thread con accesso esclusivo ad una risorsa utilizzando le 
CriticalSections, + ovviamente il Form (lo chiamo Thread Principale) con 
alcuni componenti visuali.
Obiettivo: ogni thread deve scrivere in una TListView (del thread 
principale) alcune stringhe per sapere cosa ha appena eseguito il thread 
stesso
Problema: a random ricevo un errore di "Invalid Pointer Operation" e non 
riesco a debuggarlo. Se tolgo il componente che intercetta le Exception, 
questa exception non viene presa dal debugger Delphi 2006, con il quale 
solitamente premo BRAKE e vengo mandato nella riga di codice che crea 
problemi, ma viene aperto il MessageBox con quell'errore.
Interpretazione del problema: ovviamente i threads non scrivono 
direttamente la TListView ma passano un messaggio di puntatore ad una 
struttura al Thread Principale utilizzando il "PostMessage" e 
la "Queue/Coda di Windows", per evitare che 2 threads scrivano 
contemporaneamente nel componente visuale. In questo modo serializzo la 
scrittura.
Il codice dentro i threads è:
procedure TThread1.Test(testo : string);
var NewThreadPointer : TPDati;
begin
  new(NewThreadPointer);
  NewThreadPointer^.testo := testo;
  NewThreadPointer^.imageIndex := 5;
  PostMessage(Form1.Handle, TH_MESSAGE, TH_WRITE_LIST, Integer
(NewThreadPointer));
end;
Il codice nel Form1 (Thread Principale) è:
procedure TForm1.ThreadMessage(var Message: TMessage); message TH_MESSAGE;
var NewMessage : TPDati;
begin
  NewMessage := TPDati(Message.LParam);
  Form1.Display(NewMessage^.testo, NewMessage^.imageIndex);
  NewMessage^.testo := '';
  NewMessage^.imageIndex := 0;
  Dispose(NewMessage);
  NewMessage := nil;
end;
Domanda: la variabile "NewThreadPointer" nella procedura "TThread1.Test
()" è sempre valida in tutto il processo finchè non viene eseguito 
il "Dispose()" nel Thread Principale? Ho la strana impressione che il mio 
problema sia dovuto al fatto che il comando "new()" di una variabile 
interna alla funzione "TThread1.Test()" non crei una variabile al 100% 
funzionante a tempo indefinito fuori dalla funzione stessa.
Vi risulta?
--- posted by geoForum on 
http://www.delphiedintorni.it

 funzionante a tempo indefinito fuori dalla funzione stessa.
Ti sbagli.
Non usare puntatori a record, usa un'istanza di una classe: la crei nella
funzione Test() del thread, imposti tutti i campi e mandi il reference
tramite messaggio al thread principale, che lo recupera, ne estrae i campi
e fa una .Free() sull'istanza.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

e fa una .Free() sull'istanza.
Intendi una Classe discentente da TObject con proprietà (stringhe ed 
integer) mie? Se mi confermi la discendenza posso provare, ma che 
differenza sostanziale c'è sotto-sotto? (capisco la diff tra struttura e 
istanza di oggetto, ma perchè consigli l'istanza?)


 integer) mie? 
Sì, le classi discendono tutte da TObject, in Delphi.



Secondo me quando passi una variabile per indirizzo, come hai fatto, usi cmq 
la stessa "variabile" intesa come byte di memoria.
Ma due thread non possono scrivere la stessa variabile a meno di non 
sincronizzarli.
Ciao Giorgio 

 sincronizzarli.
Questo non è tecnicamente vero.  La sincronizzazione serve solo se si ha
bisogno di sincronizzazione.
