hallo miteinander,
ich habe grad problem mit threads und werde *WAHNSINNIG*... ich habe den folgenden code
Delphi-Quellcode:
function TTCPClient.connect(aIP:
String; aPort: Integer): Boolean;
begin
Result := False;
// Port und IP übernehmen
FIP := aIP;
FPort := aPort;
try
// Read-Thread - nicht aktiv - erzeugen
FReadThread := TTCPClientReadThread.Create(True);
FReadThread.FreeOnTerminate := True;
FReadThread.IOHandler := FIOHandler;
FReadThread.onLog := log;
FReadThread.onRecieve := recieve;
// Verbindung zum Server aufbauen
FTCPClient.Connect(FIP, FPort);
// Prüfen, ob Verbindung vorhanden ist
Result := FTCPClient.Connected;
// Beim aktiver Verbindung den Lese-Thread erzeugen und ausführen lassen
FReadThread.Resume();
except
on e :
Exception do
begin
// Read-Thread terminieren
if (Assigned(FReadThread))
then
FReadThread.Terminate();
end;
end;
end;
hier wird eben ein thread erzeugt, der in gewissen abständen prüft, ob daten eingegangen sind, oder eben nicht. nun ist es so, dass beim lesen das programm stehen bleibt. ich verstehe nur nicht wieso! dies ist mein code für das onexecute beim read-thread:
Delphi-Quellcode:
procedure TTCPClientReadThread.Execute();
begin
while (
not Terminated)
do
begin
// Puffer auslesen
Synchronize(readCmd);
// 150ms Pause, sodass der Thread nicht durchgehend arbeitet
sleepEx(150, true);
end;
end;
procedure TTCPClientReadThread.readCmd();
var
cmd :
String;
begin
// IOHandler prüfen
if (
not Assigned(FIOHandler))
then
begin
// Bei Fehler terminieren
Terminate();
raise Exception.Create('
[' + Self.ClassName + '
] IOHandler ist nicht instanziiert. Es können daher keine Daten empfangen werden.');
end;
// Puffer auslesen
cmd := FIOHandler.ReadLn();
// <<< MIT DIESER ZEILE "SCHLÄFT" DAS PROGRAMM EIN
// Befehl prüfen...
if (cmd <> '
')
then
begin
// Befehl vorhanden, der dann weiter geleitet wird
if (Assigned(FOnRecieve))
then
FOnRecieve(cmd);
end;
end;
ich habe die anwendung nun soweit debuggt, dass ich sagen kann, dass diese ab dieser zeile in der
IdStackWindows.pas stehen bleibt.
Delphi-Quellcode:
class function TIdSocketListWindows.FDSelect(AReadSet, AWriteSet,
AExceptSet: PFDSet; const ATimeout: Integer): Boolean;
var
LRes: Integer;
LTime: TTimeVal;
LTimePtr: PTimeVal;
begin
{...}
// Mit dieser Zeile bleibt das Programm stehen
LRes := IdWinsock2.Select(0, AReadSet, AWriteSet, AExceptSet, LTimePtr);
end;
ich hab nun seit gestern die neuen indys, version 10.2.3 drauf und ich gehe eigentlich davon aus, dass diese so funktionieren, wie sie sollen. es hat garantiert mit meinem thread zu tun, aber warum!??? ich hab ja extra synchronize verwendet, aber die anwendung bleibt einfach stehen!
ich hoffe ihr könnt mir hierbei weiterhelfen, bin ich echt verzweifeln.
mit freundlichen grüßen
der hai
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)