Registriert seit: 12. Jan 2019
Ort: Hessen
701 Beiträge
Delphi 12 Athens
|
AW: Default-Wert aus Funktion nach timeout (D6)
31. Jul 2019, 11:25
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:
// Demofunktion
// wartet für immer, Fehler simulieren.
function get_value: integer;
begin
while 1=1 do
begin
// wait..
sleep(1);
end;
end;
Ich möchte gern get_value abrufen können, aber innerhalb zB 1 Sekunde eine Defaultwert zurück.
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!
Versuchs mal hiermit.
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;
Peter Below
|
|
Zitat
|