AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi indy und threads: probleme mit synchronize

indy und threads: probleme mit synchronize

Ein Thema von s.h.a.r.k · begonnen am 11. Sep 2008 · letzter Beitrag vom 11. Sep 2008
Antwort Antwort
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, 15: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
Benutzerbild von SubData
SubData

Registriert seit: 14. Sep 2004
Ort: Stuhr
1.078 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: indy und threads: probleme mit synchronize

  Alt 11. Sep 2008, 15:58
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.
Ronny
/(bb|[^b]{2})/
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

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

Re: indy und threads: probleme mit synchronize

  Alt 11. Sep 2008, 16:20
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?
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:34 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