Göttliche Eingebung!
In habe schon vor geraumer Zeit gelesen, dass
Indy v10 pro Client mehr als nur einen Thread zum Empfangen von Daten verwendet (ACHTUNG: Die damaligen IdPeerThreads gibt es nicht mehr!). So stammen die Events (Hinweis: Events sind asynchron, obgleich sie eine Procedure der Mainform sind!) OnUserLogin und OnConnect aus 2 verschiedenen Threads, obwohl beide zu demselben Client gehören. Diese können also unabhängig voneinander und vom MainThread selbst aufgerufen werden.
In jedem Thread wurde diese Procedure ausgeführt:
Delphi-Quellcode:
procedure TF_Server.Log(const s: string);
begin
LB_Log.Items.Add(s);
SendMessage(LB_Log.Handle, WM_VSCROLL, SB_LINEDOWN, 0);
end;
Bevor die MainForm nicht mind. einmal vor dem Benutzen dieser Procedure angezeigt wurde, verursachten die beiden Zeilen sofort oder erst beim Beenden des gesamten Programms die o.g. Fehlermeldung.
Nachdem ich die beiden Zeilen mithilfe einer eigenen Message nun wirklich
im MainThread ausführen lassen, d.h. synchronisiere, funktioniert alles ohne Fehlermeldung.
Delphi-Quellcode:
procedure TF_Server.proc_WM_LOG(var Msg: TMessage);
var
StrP: PString;
begin
StrP := PString(Msg.WParam);
try
LB_Log.Items.Add(StrP^);
SendMessage(LB_Log.Handle, WM_VSCROLL, SB_LINEDOWN, 0);
finally
Dispose(StrP);
end;
end;
procedure TF_Server.Log(const s: string);
var
StrP: PString;
begin
New(StrP);
StrP^ := s;
SendMessage(self.Handle, WM_LOG, Integer(StrP), 0); // Length(s)
end;
Wieso dieser Fehler nur dann auftritt, wenn ich die Form noch nie angezeigt habe, verstehe ich nicht so ganz. Vllt kann mir das ja noch mal jemand erklären, aber für's erste bin ich wieder glücklich
Gruß Nogge