[gelöst] System Idle Time ermitteln

Antworten
meister0815
Beiträge: 43
Registriert: Sa 26. Jun 2010, 17:10

[gelöst] System Idle Time ermitteln

Beitrag von meister0815 »

Hallo zusammen,

Wie kann ich die Zeit ermitteln, in der am Rechner nix passiert (keine Benutzereingaben)?

Für Windows finde ich:

Code: Alles auswählen

function SecondsIdle: DWord;
var
   liInfo: TLastInputInfo;
begin
   liInfo.cbSize := SizeOf(TLastInputInfo) ;
   GetLastInputInfo(liInfo) ;
   Result := (GetTickCount - liInfo.dwTime) DIV 1000;
end;


Aber unter Linux geht das nicht.

Könnt ihr mir mal wieder helfen? :-)
Zuletzt geändert von meister0815 am Di 26. Okt 2010, 00:12, insgesamt 1-mal geändert.

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: System Idle Time ermitteln

Beitrag von Euklid »

Hallo meister0815,

um die IdleTime zwischen zwei Prozessen zu messen gibt es TIdleTimer: portal.php?cx=libsearch&query=TIdleTimer
Ansonsten könnte man die Idle-Zeit über den Konsole-Befehl "w" abfragen. In diesem Fall müsstest Du w als externes Programm starten und die Programmausgabe mit Deinem Programm abfangen.


Viele Grüße, Euklid

meister0815
Beiträge: 43
Registriert: Sa 26. Jun 2010, 17:10

Re: System Idle Time ermitteln

Beitrag von meister0815 »

Hallo Euklid, Danke für Deine Antwort!

Mit TIdleTimer habe ich es schon versucht, aber der fängt mir nur die Idle Time meines Programms ab, also wenn die Maus nicht über dem Form ist, aber immer noch aktiv, dann wird das trotzdem als Idle gewertet. Das selbe mit Tastatureingaben.

Das mit "w" wäre eine Idee, aber das zu parsen ist ja die Hölle! Glaub nicht, ob ich das hinkriege...

Viele Grüße, Meister0815

EDIT:

Hab gerade versucht, mit "w" zu arbeiten. Nur leider wird meine Abfrage von "w" als Bash-Aktion gewertet und der Idle-Wert sofort zurückgesetzt.
Mein Code:

Code: Alles auswählen

function CheckW: Boolean;
var aProcess: TProcess;
    sl : TStringList;
    i: Integer;
begin
  Result := false;
  aProcess := TProcess.Create(nil);
  try
    aProcess.CommandLine := 'w';
    aProcess.Options := aProcess.Options + [poWaitOnExit, poUsePipes];
    sl := TStringList.Create;
    try
      aProcess.Execute;
      sl.LoadFromStream(aProcess.Output);
      Form1.Memo1.Lines:=sl;
      Result:= true;
    finally
      sl.Free;
    end;
  finally
    aProcess.Free;
  end;
end;

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: System Idle Time ermitteln

Beitrag von Euklid »

Hm. Leuchtet ein. Dann weiß ich leider auch nicht weiter.

Möglicherweise gibt es eine Kernel-Schnittstelle für sowas. Kenne mich in diesem Bereich nicht aus.

- Euklid

meister0815
Beiträge: 43
Registriert: Sa 26. Jun 2010, 17:10

Re: System Idle Time ermitteln

Beitrag von meister0815 »

Bei Ubuntuusers wurde das Problem gelöst:

Ich benutze jetzt ein Mini-C-Programm als Kommandozeilen Tool, dass ich von Lazarus aus aufrufe und deren Ausgabe ich dann verarbeite.

Genauere Infos hier im Thread.

Danke an alle Helfer hier! :-)

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: System Idle Time ermitteln

Beitrag von Euklid »

meister0815 hat geschrieben:Ich benutze jetzt ein Mini-C-Programm als Kommandozeilen Tool, dass ich von Lazarus aus aufrufe und deren Ausgabe ich dann verarbeite.


Ich vermute, dass es die im c-Programm verwendeten Systembefehle in den Lazarus-uses-Bibliotheken xlib oder x existieren. Habe keine Zeit, selbst nachzuschauen, aber der im Link geschilderte Zugriff sollte auch ohne Umweg über das C-Programm funktionieren.

Gruß, Euklid

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: System Idle Time ermitteln

Beitrag von Scotty »

Auch wenn die Antwort etwas spät kommt: "w" respektive who ist doch nur eine Benutzerabfrage. "cat /proc/loadavg" liefert alles, was man braucht und ist auch leicht zu parsen (http://de.wikipedia.org/wiki/Load). Unter /proc gibt es alle Informationen zu jedem einzelnen Prozess. Wenn es jede CPU einzeln abgefragt werden soll, dann kann man "cat /proc/stat" nehmen oder "cat /proc/<procid>/stat|status" wenn einzelne Prozesse interessieren.

Antworten