2010-05-06 14 views
6

Jest to dość podchwytliwe pytanie, ponieważ nie znalazłem żadnych informacji w Internecie. Zasadniczo chciałbym wiedzieć, jak sprawdzić, czy komputer jest bezczynny w Javie. Chciałbym, aby program działał tylko wtedy, gdy komputer jest w użyciu, ale jeśli jest bezczynny, to nie.Java: Sprawdzanie, czy komputer jest bezczynny

Jedynym sposobem mogę myśleć robi to podpinania do myszy/klawiatury i posiadające timer.

MSN Messenger ma że „z dala” cecha, życzę czegoś podobnego do tego.

+0

Nie ma przenośnego sposobu robienia tego. Na jakie systemy celujesz? Jaka jest twoja definicja bezczynności? –

+0

Może znajdziesz rozwiązanie tego pokrewnego pytania: http://stackoverflow.com/questions/614227/how-to-detect-that-a-pc-has-been-idle-for-30-seconds-using-java – Prine

Odpowiedz

0

Nic w niezależny od platformy JRE będzie odpowiedzieć na to pytanie. Możesz być w stanie odgadnąć, mierząc czas zegara dla obliczeń, ale nie byłby on wiarygodny. Na konkretnych platformach mogą istnieć interfejsy API dostawców, które mogą Ci pomóc.

+0

To nie tyle czas bezczynności systemu, który muszę znaleźć. Po prostu muszę go znaleźć, ponieważ użytkownik korzysta z komputera w ciągu ostatnich 10 minut. Gruntownie. Chcę, by powiadomienia wyświetlały się tylko wtedy, gdy użytkownik faktycznie znajduje się na swoim komputerze. –

+0

Myślę, że jest to nawet bardziej niemożliwe niż użycie czasu procesora. – bmargulies

0

1) Utwórz nowy wątek.

2) dać mu super super niski priorytet (najniższy można)

3) Każda sekunda lub dwie, mają nić zrobić jakieś proste zadanie. Jeśli super szybki, przynajmniej 1 CPU jest bezczynny. Jeśli robi to wolno, to przynajmniej 1 rdzeń nie jest bezczynny.

Lub

Po prostu uruchom swój program z niskim priorytetem. To pozwoli systemowi operacyjnemu zajmować się uruchamianiem innych programów nad twoim programem.

1

Nie jestem profesjonalistą, ale mam pomysł:

można użyć Java w informacji mysz klasę, by sprawdzić pozycję myszy w certian przedziały powiedzieć tak:

import java.awt.MouseInfo; 

public class Mouse { 
    public static void main(String[] args) throws InterruptedException{ 
     while(true){ 
      Thread.sleep(100); 
      System.out.println("("+MouseInfo.getPointerInfo().getLocation().x+", "+MouseInfo.getPointerInfo().getLocation().y+")"); 
     } 
    } 
} 

zastąpić oświadczenie drukującej logika, jak gdyby dla pewnego przedziału powiedzmy 1 min przeszłe położenie myszy jest takie samo jak nowa pozycja (możesz po prostu porównać tylko współrzędne x), co oznacza, że ​​system jest bezczynny i możesz kontynuować swoje działanie, jak chcesz (Mam nadzieję, że jest to legalna czynność, którą chcesz zaimplementować :-)

Aby ją zaimplementować w nowym wątku, w przeciwnym razie program główny zawiesi się w celu sprawdzenia stanu bezczynności.

1

Możesz rozwiązać ten problem za pomocą klasy robotów Java.

Użyj klasy robota zrobić zrzut ekranu, a następnie czekać na powiedzmy 60 sekund i zrobić kolejny zrzut ekranu. Porównaj ze sobą zrzuty ekranu, aby sprawdzić, czy nastąpiły jakieś zmiany , ale nie porównuj zrzutów ekranu piksel po pikselu. Sprawdź procent pikseli, które uległy zmianie. Powodem jest to, że nie chcesz, aby małe różnice, takie jak zegar systemu Windows, zakłócały wynik. Jeśli wartość procentowa jest mniejsza niż 0,005% (lub cokolwiek innego), komputer prawdopodobnie pracuje na biegu jałowym.

import java.awt.AWTException; 
import java.awt.DisplayMode; 
import java.awt.GraphicsDevice; 
import java.awt.GraphicsEnvironment; 
import java.awt.Rectangle; 
import java.awt.Robot; 
import java.awt.Toolkit; 
import java.awt.image.BufferedImage; 

public class CheckIdle extends Thread { 
    private Robot robot; 
    private double threshHold = 0.05; 
    private int activeTime; 
    private int idleTime; 
    private boolean idle; 
    private Rectangle screenDimenstions; 

    public CheckIdle(int activeTime, int idleTime) { 
     this.activeTime = activeTime; 
     this.idleTime = idleTime; 

     // Get the screen dimensions 
     // MultiMonitor support. 
     int screenWidth = 0; 
     int screenHeight = 0; 

     GraphicsEnvironment graphicsEnv = GraphicsEnvironment 
       .getLocalGraphicsEnvironment(); 
     GraphicsDevice[] graphicsDevices = graphicsEnv.getScreenDevices(); 

     for (GraphicsDevice screens : graphicsDevices) { 
      DisplayMode mode = screens.getDisplayMode(); 
      screenWidth += mode.getWidth(); 

      if (mode.getHeight() > screenHeight) { 
       screenHeight = mode.getHeight(); 
      } 
     } 

     screenDimenstions = new Rectangle(0, 0, screenWidth, screenHeight); 

     // setup the robot. 
     robot = null; 
     try { 
      robot = new Robot(); 
     } catch (AWTException e1) { 
      e1.printStackTrace(); 
     } 

     idle = false; 
    } 

    public void run() { 
     while (true) { 
      BufferedImage screenShot = robot 
        .createScreenCapture(screenDimenstions); 

      try { 
       Thread.sleep(idle ? idleTime : activeTime); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 

      BufferedImage screenShot2 = robot 
        .createScreenCapture(screenDimenstions); 

      if (compareScreens(screenShot, screenShot2) < threshHold) { 
       idle = true; 
       System.out.println("idle"); 
      } else { 
       idle = false; 
       System.out.println("active"); 
      } 
     } 
    } 

    private double compareScreens(BufferedImage screen1, BufferedImage screen2) { 
     int counter = 0; 
     boolean changed = false; 

     // Count the amount of change. 
     for (int i = 0; i < screen1.getWidth() && !changed; i++) { 
      for (int j = 0; j < screen1.getHeight(); j++) { 
       if (screen1.getRGB(i, j) != screen2.getRGB(i, j)) { 
        counter++; 
       } 
      } 
     } 

     return (double) counter 
       /(double) (screen1.getHeight() * screen1.getWidth()) * 100; 
    } 

    public static void main(String[] args) { 
     CheckIdle idleChecker = new CheckIdle(20000, 1000); 
     idleChecker.run(); 
    } 
} 
+2

Nie będę pracować z wygaszaczem ekranu. –

+0

@Tim, masz rację. Musi dodać monitor myszki i ... – Reg

+1

Ale potem znowu, dlaczego nie tylko użyć monitora myszy i wyrzucić resztę :) – Reg

Powiązane problemy