AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Timer ohne VCL

Ein Thema von Mr_G · begonnen am 30. Mai 2009 · letzter Beitrag vom 31. Mai 2009
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von Mr_G
Mr_G

Registriert seit: 2. Sep 2004
Ort: Duisburg
468 Beiträge
 
Delphi 2006 Professional
 
#1

Timer ohne VCL

  Alt 30. Mai 2009, 17:58
Hallo zusammen,
ich Suche eine Möglichkeit in einem Thread auf einen bestimmten Zeitpunkt zu warten. Meine Idee war nun die Differenz zwischen dem aktuellen und dem Zielzeitpunkt zu berechnen und dann zu warten.
Meine Frage: Wie mach ich das nun am besten?
Eine Möglichkeit die ich gefunden habe wäre ein WaitForSingleObject mit dem entsprechenden Intervall, doch ich frage mich ob es dort nicht zu größeren Abweichungen kommen kann.
Jan
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Timer ohne VCL

  Alt 30. Mai 2009, 18:13
Was denn für einen bestimmten Zeitpunkt?
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Timer ohne VCL

  Alt 30. Mai 2009, 18:17
Bei WaitForSingleObject sollte es eigentlich nicht zu größeren Abweichungen kommen, ist aber letztlich auch nicht genauer als Sleep.
Die normale Variante verwendet Waitable-Timer-Objekte. Du kannst zum Beispiel sagen, dass ein Waitable Timer zu einem bestimmten Zeitpunkt (absolut) oder nach einer bestimmten Zeit (relativ) signalisiert werden soll. Auf den Timer kannst du dann mit einer beliebigen Wait Function warten.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von Mr_G
Mr_G

Registriert seit: 2. Sep 2004
Ort: Duisburg
468 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Timer ohne VCL

  Alt 30. Mai 2009, 18:34
Waitable-Timer-Objekte... ich glaube, dass war das Stichwort, was ich gesucht habe!
Vielen Dank!
Jan
  Mit Zitat antworten Zitat
Benutzerbild von Mr_G
Mr_G

Registriert seit: 2. Sep 2004
Ort: Duisburg
468 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Timer ohne VCL

  Alt 31. Mai 2009, 12:06
Ich habe nun mal ein bisschen mit diesen Waitable-Timer-Objects rumgespielt. Leider verstehe ich das mit dem APC-Callback nicht. Dieser wird bei mir nicht ausgelöst:
Delphi-Quellcode:
procedure Trigger(lpArgToCompletionRoutine: Pointer; dwTimerLowValue, dwTimerHighValue: DWORD);
begin
  ShowMessage('Callback...');
end;

procedure TForm1.Button1Click(Sender: TObject);
var Wecker: SYSTEMTIME;
    CorrectTriggerTime, TriggerTime: FILETIME;
    DueTime: LARGE_INTEGER;
begin
  GetLocalTime(Wecker);
  Wecker.wMinute := Wecker.wMinute +1;
  SystemTimeToFileTime(Wecker, TriggerTime);
  LocalFileTimeToFileTime(TriggerTime, CorrectTriggerTime);
  DueTime.LowPart := CorrectTriggerTime.dwLowDateTime;
  DueTime.HighPart := CorrectTriggerTime.dwHighDateTime;

  SetWaitableTimer(WndTimer, DueTime.QuadPart, 0, @Trigger, nil, True);
  WaitForSingleObjectEx(WndTimer, INFINITE, True);
  Showmessage('Schluss');
end;
Bei dem Test wird wie gewünscht eine Minute gewartet, der der Callback wird aber nicht aufgerufen. Das mit den APCs durchschaue ich im Moment leider nicht. Ich würde mich freuen, wenn mir jemand auf die Sprünge helfen könnte!
Jan
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Timer ohne VCL

  Alt 31. Mai 2009, 12:16
Du hast bei den Waitable Timern zwei verschiedene Möglichkeiten: Entweder du wartest auf das Objekt, oder du lässt dich per APC benachrichtigen. Du vermischst hier beides. Dabei passiert folgendes: Wenn der Timer ausgelöst wird, wird zunächst dein Thread aus dem WaitForSingleObjectEx "befreit"; danach wird die APC in die Warteschlange deines Threads gesetzt. Der Thread ist jedoch schon wieder bereit zum Weiterlaufen und hat damit den Zustand, in dem er APCs verarbeiten kann, verlassen.
Du solltest dich jetzt entscheiden: Wenn du WaitForSingleObjectEx verwendest, brauchst du APCs nicht, da du ja direkt erfährst, wann der Timer ausgelöst wurde; wenn du APCs verwendest, brauchst du WaitForSingleObjectEx nicht, sondern musst nur periodisch in den "alertable wait state" gehen, z.B. mit SleepEx.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
39.653 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Timer ohne VCL

  Alt 31. Mai 2009, 12:25
und bist'e dir mit der Aufrufkonvention für dein Trigger ganz sicher? (ich hätte da jetzt ein stdcall erwartet)

aber so wie der Code in #5 ist, würde da auch ein Sleep ausreichen.

PS: der Trigger ist da, damit der Thread weiterlaufen kann und bei Ablauf der Zeit benachrichtigt wird.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Benutzerbild von Mr_G
Mr_G

Registriert seit: 2. Sep 2004
Ort: Duisburg
468 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Timer ohne VCL

  Alt 31. Mai 2009, 12:49
Zitat von himitsu:
und bist'e dir mit der Aufrufkonvention für dein Trigger ganz sicher? (ich hätte da jetzt ein stdcall erwartet)
Du hast natürlich Recht...
Zitat von himitsu:
PS: der Trigger ist da, damit der Thread weiterlaufen kann und bei Ablauf der Zeit benachrichtigt wird.
Wie meinen?
Jan
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Timer ohne VCL

  Alt 31. Mai 2009, 12:51
APCs sind dazu da, damit du WaitForSingleObjectEx nicht brauchst.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von Mr_G
Mr_G

Registriert seit: 2. Sep 2004
Ort: Duisburg
468 Beiträge
 
Delphi 2006 Professional
 
#10

Re: Timer ohne VCL

  Alt 31. Mai 2009, 12:59
Tjo... nur kommt das nicht am Ende aufs gleiche raus? Bei dem einen muss ich ab und an mit WaitForSingleObject nachfragen und bei den APCs muss ich mit SleepEx auch ab und zu die Gelegenheit geben den Callback auszuführen.
Jan
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

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 11:53 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf