![]() |
indy und threads: probleme mit synchronize
hallo miteinander,
ich habe grad problem mit threads und werde *WAHNSINNIG*... ich habe den folgenden code
Delphi-Quellcode:
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:
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;
Delphi-Quellcode:
ich habe die anwendung nun soweit debuggt, dass ich sagen kann, dass diese ab dieser zeile in der IdStackWindows.pas stehen bleibt.
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;
Delphi-Quellcode:
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!
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 hoffe ihr könnt mir hierbei weiterhelfen, bin ich echt verzweifeln. mit freundlichen grüßen der hai |
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. |
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 16:57 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz