In Dephi, creo un filo, come questo, che invierà un messaggio al modulo principale di tanto in tantoi dati di invio stringa a partire da fili a forma principale
Procedure TMyThread.SendLog(I: Integer);
Var
Log: array[0..255] of Char;
Begin
strcopy(@Log,PChar('Log: current stag is ' + IntToStr(I)));
PostMessage(Form1.Handle,WM_UPDATEDATA,Integer(PChar(@Log)),0);
End;
procedure TMyThread.Execute;
var
I: Integer;
begin
for I := 0 to 1024 * 65536 do
begin
if (I mod 65536) == 0 then
begin
SendLog(I);
End;
End;
end;
dove WM_UPDATEDATA è un messaggio personalizzato, definito di seguito:
const
WM_UPDATEDATA = WM_USER + 100;
E in forma principale, lo farà come segue per aggiornare l'elenco:
procedure TForm1.WMUpdateData(var msg : TMessage);
begin
List1.Items.Add(PChar(msg.WParam));
end;
Tuttavia, come il registro la stringa inviata al modulo principale è una variabile locale, che verrà distrutta dopo aver chiamato SendLog. Mentre TForm1.WMUpdateData elabora il messaggio in modo asincrono, è possibile che quando viene richiamato, la stringa Log sia già stata distrutta. Come risolvere questo problema?
Penso che forse posso allocare lo spazio di stringa in uno spazio di sistema globale e quindi passarlo al messaggio, quindi dopo TForm1.WMUpdateData elabora il messaggio, esso può distruggere lo spazio di stringa nello spazio globale. È una soluzione praticabile? Come implementarlo?
Grazie
Guardate qui http://stackoverflow.com/questions/9932164/postmessage-lparam-truncation Speriamo che aiuta – Arkady
È necessario dichiarare la variabile Log come una variabile globale. –
@ S.MAHDI No! Cosa succede se ci sono due messaggi in coda? –