![]() |
Default-Wert aus Funktion nach timeout (D6)
Hallo alle,
ich bin dabei eine Funktion zu schreiben das eine Wert über Netzwerk abfragt. Normalerweise geht das sehr schnell, weniger als 100 msec. Aber ich möchte nicht das mein Programm sich abhängt wenn zB die Verbindung geht. Wie mache ich eine "Timeout" feature, das nach zB 1 Sek eine Default-Wert zurückgibt ? Beispiel:
Delphi-Quellcode:
Ich möchte gern get_value abrufen können, aber innerhalb zB 1 Sekunde eine Defaultwert zurück.
// Demofunktion
// wartet für immer, Fehler simulieren. function get_value: integer; begin while 1=1 do begin // wait.. sleep(1); end; end; Ich bin unter Delphi6, und habe leider zu wenig Erfahrung mit TThreads gemacht (vermute Threads ist die Lösung ??). Deshalb wenn möglich (Triviales) komplettbeispiel ? Danke für jeder Hilfe! |
AW: Default-Wert aus Funktion nach timeout (D6)
Threads und Trivial gehen in der Regel nicht zusammen.
|
AW: Default-Wert aus Funktion nach timeout (D6)
Hier zumindest mal ein
![]() |
AW: Default-Wert aus Funktion nach timeout (D6)
Hmm..
Zitat:
Welche 'Netzwerkkomponente' (Indy, Socket..) verwendest Du denn für deine Abfrage? Diese Komponenten haben i.R. einen eigenen TimeoutTimer, welcher einfach nur auf eine Sekunde reduziert werden müsste. Die Defaultwerte können deutlich höher sein.. Google mal mit dem ClassName und 'TimeOut' und Du wirst Beispiele finden. Das ganze mit einem ordentlichen Try Except, bzw. Errorhandling der Komponente und beim Fehler kommt ein Defaultwert. |
AW: Default-Wert aus Funktion nach timeout (D6)
Zitat:
Viel einfacher wäre es, wenn die Lizenzbedingungen es zulassen, von einer bald 20 Jahre alten Entwicklungsumgebung auf etwas neueres zu wechseln das z.B. "Tasks" hat. Dann sieht es in Delphi nur noch so aus:
Delphi-Quellcode:
Könnte so einfach sein 😉
function TForm1.holeNetzwerkDaten(): Integer;
begin TThread.Sleep( Random(1000) ); Result := 42; end; function TForm1.holeNetzwerkDaten(const timeoutMs: Word): Integer; const standardWert: Integer = 99; var future: IFuture<Integer>; begin future := TTask.Future( function(): Integer begin Result := holeNetzwerkDaten(); end ); if future.Wait(timeoutMs) then Result := future.Value else begin future.Cancel(); Result := standardWert; end; end; |
AW: Default-Wert aus Funktion nach timeout (D6)
Ja, neuers Delphi würde auch mit
![]() ![]() Da steht zwar bis runter zu D2007, könnte aber sein das auch Teile schon ab D6 funktionieren (vielleicht hat da ja jemand hier Erfahrung ob das läuft). |
AW: Default-Wert aus Funktion nach timeout (D6)
Zitat:
Delphi-Quellcode:
type
TWorkthread = class(TTHread) strict private FValue: Integer; protected procedure Execute; override; public property Value: Integer read FValue; end; procedure TWorkthread.Execute; begin // code to get the data goes here // for now simulate a 10 second delay sleep(10000); FValue := 666; end; function get_value: integer; const OneSecond = 1000; DefaultValue = 999; var LResult: dword; LWorker : TWorkthread; begin // thread starts running immediately LWorker := TWorkthread.Create; try LResult := WaitForSingleObject(LWorker.Handle, OneSecond); if LResult = WAIT_OBJECT_0 then Result := LWorker.Value else if LResult = WAIT_TIMEOUT then begin LWorker.FreeOnTerminate := true; LWorker := nil; //abandon the thread Result := DefaultValue; end else raise Exception.CreateFmt('Thread creation failed, wait result was $%x',[LResult]); finally LWorker.Free; end; end; |
AW: Default-Wert aus Funktion nach timeout (D6)
Hmm..
Zitat:
kleine Korrectur für D6 ;)
Delphi-Quellcode:
type
TWorkthread = class(TTHread) private // Delphi 6 kennt noch kein strict FValue: Integer; protected procedure Execute; override; public property Value: Integer read FValue; end; procedure TWorkthread.Execute; begin // code to get the data goes here // for now simulate a 10 second delay sleep(10000); FValue := 666; end; function get_value: integer; const OneSecond = 1000; DefaultValue = 999; var LResult: dword; LWorker : TWorkthread; begin // thread starts running immediately LWorker := TWorkthread.Create(False); // TThread benötigt (False) bei D6 try LResult := WaitForSingleObject(LWorker.Handle, OneSecond); if LResult = WAIT_OBJECT_0 then Result := LWorker.Value else if LResult = WAIT_TIMEOUT then begin LWorker.FreeOnTerminate := true; LWorker := nil; //abandon the thread Result := DefaultValue; end else raise Exception.CreateFmt('Thread creation failed, wait result was $%x',[LResult]); finally LWorker.Free; end; end; |
AW: Default-Wert aus Funktion nach timeout (D6)
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:13 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 by Thomas Breitkreuz