AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Default-Wert aus Funktion nach timeout (D6)

Ein Thema von myicq · begonnen am 31. Jul 2019 · letzter Beitrag vom 31. Jul 2019
 
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
716 Beiträge
 
Delphi 12 Athens
 
#7

AW: Default-Wert aus Funktion nach timeout (D6)

  Alt 31. Jul 2019, 10: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
  Mit Zitat antworten Zitat
 

 

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 19:03 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