Einzelnen Beitrag anzeigen

Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#1

indy und threads: probleme mit synchronize

  Alt 11. Sep 2008, 14:28
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)
  Mit Zitat antworten Zitat