Hmmmm, ich hab jetzt alles mal auf das Synapsis umgebaut, und wieder die gleichen Fehler bekommen.
Meine Vermutung war falsch, dass es am
TCP lag. Das Problem ist ganz woanders. Es liegt am Thread.
Vielleicht kann mir da einer weiter helfen.
Das Szenario war bei allen
TCP Sachen gleich.
- Es läuft ein Hauptprogramm, was ein Log-Fenster pro Client führt
- Es läuft ein
TCP-Server im Thread
- Pro Client wird ein Thread angelegt
Wenn eine Verbindung in den
TCP-Server reinkommt, erzeuge ich ein Client und lege ich ein neues Tabsheet auf meinem Hauptfenster an, an das ich den ClientThread übergebe.
Ich denke, das Log-Fenster hängt dann oder meldet komische Fehler, weil der
TCP-Server das Fenster erzeugt, und danach wieder in seinen "Ich warte auf Verbindungen" Modus geht.
Der Client Thread macht ja auch das selbe, er wartet auf Daten.
Nachdem ich mich in Thread-Handling ein bisschen eingearbeitet habe, habe ich Events gefunden. Diese soll man über Syncronize aufrufen können, damit nicht der
TCP-Server, sondern der Hauptthread das Fenster öffnet.
Leider klappt das ganze aber auch nicht. Er bleibt beim Aufruf des Sync Befehls stehen.
Zusätzlich habe ich, weil der Sync ja nur einen Pointer übergeben bekommt, habe ich die Daten, die ich an den Hauptthread schicken will, mir im TCPServer Thread gemerkt (im Private Bereich), und dann in der Funktion wieder aufgerufen.
Delphi-Quellcode:
constructor TMainUnit.Create(aOwner: TComponent);
begin
inherited;
FTCPServer := TiBDITCPServer.Create;
FTCPServer.OnClientAdded := CreateLogWindow;
end;
Delphi-Quellcode:
procedure TiBDITCPServer.Execute;
var
vClientSock: TSocket;
vClient: TiBDITCPServerConnectionItem;
begin
FActive := True;
FSocket.CreateSocket;
FSocket.setLinger(true, 10);
FSocket.bind('0.0.0.0', '4000');
FSocket.listen;
repeat
if terminated then break;
if FSocket.canread(cDefaultCanReadTime) then
begin
if FSocket.lastError = 0 then
begin
vClientSock := FSocket.accept;
vClient := TiBDITCPServerConnectionItem.Create(Self, vClientSock);
FUpdateClient := vClient;
Synchronize(SyncClientAdded);
end;
end;
CheckConnections;
until false;
FActive := False;
end;
Delphi-Quellcode:
procedure TiBDITCPServer.SyncClientAdded;
begin
if Assigned(FOnClientAdded) then FOnClientAdded(Self, aClient);
end;
Ich hab auch mal die Ganze TCPServer.pas mit angehangen.