Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi indy und threads: probleme mit synchronize (https://www.delphipraxis.net/120494-indy-und-threads-probleme-mit-synchronize.html)

s.h.a.r.k 11. Sep 2008 14:28


indy und threads: probleme mit synchronize
 
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

SubData 11. Sep 2008 14:58

Re: indy und threads: probleme mit synchronize
 
Syncronize sorgt dafür, dass der entsprechende Abschnitt im Hauptthread ausgeführt wird.
Das bedeutet: Wenn der Thread hängt, hängt das ganze Programm.

s.h.a.r.k 11. Sep 2008 15:20

Re: indy und threads: probleme mit synchronize
 
ich habe das problem nun in den griff bekommen. es lag daran, dass ich keinen timeout für das readln beim iohandler gesetzt hatte. somithat der thread praktisch immer darauf gewartet bis daten kommen. nun könnte das an sich ja nicht schlecht sein, da der thread dann praktisch ein ereignis darstellt, es ist dann aber so, dass das beenden des programms mir noch probleme bereitet, da der thread ja immer noch aktiv ist.

wenn ich nun noch herausfinde, wie man einen aktiven (evtl. wartenden) thread abschießt, ohne, dass eine fehlermeldung erscheint habe ich gewonnen und das gewünschte ergebnise wäre da ;)

bisher habe ich halt einen timeout von 100ms gewählt. ist nun halt auch die frage, welcher timeout überhaupt in einem eigentlich guten 100mbit unternehmensnetzwerk sinnvoll ist?


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:18 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz