In Dephi ich einen Thread erstellen, wie diese, die Nachricht an Hauptform von Zeit zu Zeit senden wirdSenden String-Daten von Themen zur Hauptform
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;
wo WM_UPDATEDATA ist eine benutzerdefinierte Nachricht, wie unten definiert:
const
WM_UPDATEDATA = WM_USER + 100;
Und in Haupt-Form wird es tun, wie die Liste zu aktualisieren folgt:
procedure TForm1.WMUpdateData(var msg : TMessage);
begin
List1.Items.Add(PChar(msg.WParam));
end;
jedoch als Log, Die an das Hauptformular gesendete Zeichenfolge ist eine lokale Variable, die nach dem Aufruf von SendLog gelöscht wird. Während TForm1.WMUpdateData die Nachricht asynchron verarbeitet, ist es möglich, dass die Protokollzeichenfolge beim Aufruf bereits zerstört wurde. Wie man dieses Problem löst?
Ich denke vielleicht kann ich den Zeichenfolgenraum in einem globalen Systemraum zuordnen und dann an die Nachricht übergeben, dann, nachdem TForm1.WMUpdateData die Nachricht verarbeitet, kann es den Zeichenfolgenraum im globalen Raum zerstören. Ist das eine praktikable Lösung? Wie implementiert man das?
Danke
Schauen Sie hier http://stackoverflow.com/questions/9932164/postmessage-lparam-truncation Hoffentlich hilft es – Arkady
Sie benötigen eine Log-Variable als globale Variable deklarieren. –
@ S.MAHDI Nein! Was passiert, wenn zwei Nachrichten in der Warteschlange stehen? –