AGB  ·  Datenschutz  ·  Impressum  







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

Windows-Benutzer-Leerlaufzeit

Ein Thema von Der schöne Günther · begonnen am 1. Dez 2017 · letzter Beitrag vom 3. Dez 2017
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.340 Beiträge
 
Delphi 12 Athens
 
#1

AW: Windows-Benutzer-Leerlaufzeit

  Alt 2. Dez 2017, 21:17
So aufwändig ist es garnicht nötig, wenn man mit Überläufen rechnet.

x := GetTickCount - LastUserInput;
// oder sicherheitshalber immer mit Cast, wenn der implizite Cast durch due Zielvariable nicht ausreicht und wenn dich die Compilermeldungen stören
x := Cardinal(GetTickCount - LastUserInput);
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.196 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Windows-Benutzer-Leerlaufzeit

  Alt 3. Dez 2017, 08:40
Vielen Dank für die Antworten, so werde ich es glaube ich machen: Einfach GetTickCount64 gegen GetTickCount tauschen (zumindest an dieser Stelle).

Da könnte er nach genau 49.7 Tagen einmal kurz falsch liegen aber wen kümmert das
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
771 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Windows-Benutzer-Leerlaufzeit

  Alt 3. Dez 2017, 15:35
Zitat:
So aufwändig ist es gar nicht nötig, wenn man mit Überläufen rechnet.
Wir testen Programmteile halt immer auch mit eingeschalteter Überlaufprüfung. Und dann sind Dinge wie

x := GetTickCount - LastUserInput; unangenehm, weil im Fall GetTickCount < LastUserInput eine Integerüberlauf-Exception ausgelöst (und x nicht berechnet) wird - und der Code beim Testen somit durchfällt.

Bei ausgeschalteter Überlaufprüfung wird keine Exception ausgelöst und es wird "richtig" gerechnet.


Zitat:
Da könnte er nach genau 49.7 Tagen einmal kurz falsch liegen aber wen kümmert das
In der Release Version hast du wahrscheinlich/sicher Überlaufprüfung auf AUS. Dann rechnet dein Programm auch dann richtig, wenn GetTickCount < LastUserInput - dein Programm wird also nach Ersetzen von GetTickCount64 durch GetTickCount korrekte Werte berechnen (solange der letzte Userinput nicht mehr als 49 Tage zurückliegt):

Delphi-Quellcode:
var a, b , res : cardinal;
begin
  a := high(cardinal);
  b := 0;
  res := b-a;
res=1
Michael Gasser
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.196 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Windows-Benutzer-Leerlaufzeit

  Alt 3. Dez 2017, 16:11
Ja. Das Integer-Exception-Problem sehe ich nicht auftreten, denn in meinem Fall ist die Variable x kein DWORD oder irgendein Unsigned-Typ sondern ein Double (Parameter von TTimeSpan.FromMilliseconds(..) )
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
981 Beiträge
 
Delphi 6 Professional
 
#5

AW: Windows-Benutzer-Leerlaufzeit

  Alt 3. Dez 2017, 16:25
Hmm..

Mal eine Frage:
Muss es überhaupt GetTickCount sein?

Reichen nicht die Millisekunden von TDateTime?

Mit Now die Startzeit vom Idle nehmen und dann kann mit MilliSecondsBetween die Differenz zum Ende von Idle ermittelt werden.
Aufsummieren und schon haste die Gesamtzeit in ms.

Für eine (einfache) Erfassung sollte dies auch ohne Überlauf ausreichen.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.196 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Windows-Benutzer-Leerlaufzeit

  Alt 3. Dez 2017, 16:32
Woher soll ich wissen wann ich Now() aufrufen soll um den Zeitstempel zu aktualisieren und wann nicht? Das verstehe ich nicht.

GetLastInputInfo() liefert einen fertigen Zeitstempel wann jemand die aktuelle Windows-Sitzung das letzte mal bedient hat. Bis auf den Überlauf eigentlich schön einfach.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.340 Beiträge
 
Delphi 12 Athens
 
#7

AW: Windows-Benutzer-Leerlaufzeit

  Alt 3. Dez 2017, 19:16
Ihr wisst aber, dass man die Überlaufprüfung um die Stelle mit dem Überlauf auch deaktivieren kann?
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.196 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Windows-Benutzer-Leerlaufzeit

  Alt 3. Dez 2017, 21:28
Es gibt keinen Überlauf. Wir rechnen DWORD minus DWORD und stecken das in ein Double. Völlig legitim

Der "Überlauf" dass der TickCount eines Tages wieder bei Null vonstatten geht geschieht ja irgendwo in den Untiefen des Windows-Kernels und nicht meiner Delphi-Anwendung.
  Mit Zitat antworten Zitat
Antwort Antwort


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 18:17 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