2011-01-05 3 views
2

Ich schreibe eine Eclipse RCP-Anwendung, die andere Plug-in-Beiträge neben meiner eigenen haben wird, und bestimmen müssen, wenn die Anwendung im Leerlauf ist (dh keine Aktivität für einen Zeitraum, Anwendung minimiert ist, etc.) und wenn das ändert (dh die Anwendung wird wieder in den Vordergrund gebracht, eine Maus angeklickt usw.).Eclipse RCP-Anwendung - Wie erkennt man, wenn die Anwendung im Leerlauf ist?

Das Problem, das ich habe, ist, dass ich alle Anwendung Tastenanschläge und Mausbewegungen/Klicks erfassen würde ... damit einen Timer zurückzusetzen, und wenn der Timer getroffen wird, kann einige Leerlaufverarbeitung auftreten (dh Informieren eines Servers über die Untätigkeit - und dann wieder, wenn wir aktiv werden - nichts Intensives). Die Anwendungsfenster-Shell empfängt jedoch keine untergeordneten Ereignisse für die verschiedenen Ansichten usw., so dass mir entweder etwas fehlt oder dies der falsche Ansatz ist.

Kann jemand eine Lösung anbieten? Ich bin nicht auf der Suche nach systemweiter Leerlauf - nur Anwendung Leerlauf.

Danke.

Antwort

1

Vielleicht

display.addFilter(SWT.MouseDown, new Listener() { 
     @Override 
     public void handleEvent(Event event) { 
     } 
    }); 

ist das, was Sie suchen (Sie können auch andere Ereignisse hinzufügen, auch)?

Dies wird ausgeführt, bevor die Ereignisbehandlung weise Komponente erfolgt ...

Aber seine Verwendung nicht allgemein empfohlen wird - es ist eine sehr eingeschränkte Nutzung Fall sein sollte, so.

+0

Ich denke, dass dies der Weg ist, den ich gehen werde. Nicht ideal, stimme ich zu. Ich hatte gehofft, diesen Anruf zu vermeiden, da es gefährlich sein kann. Ich benutze auch den Müllsammlungscode als ein Beispiel, um es dicht zu halten (siehe die dritte Antwort unten). – ssnyder

1

Sie können die Tatsache verwenden, dass die Methode readAndDispatch false zurückgibt, wenn keine weiteren Nachrichten zu verarbeiten sind. Etwas wie folgt aus:

long lastActivityAt = 0; 
int idleThresholdSecs = 5; 
while (true) 
{ 
    while (display.readAndDispatch()) 
    { 
     lastActivityAt = System.nanoTime(); 
    } 

    if (System.nanoTime() - lastActivityAt > idleThresholdSecs * 1000 * 1000 * 1000) 
    { 
     // we have been idle for at least "idleThresholdSecs" 
     ... 
    } 
    else 
    { 
     Thread.sleep(50); 
    } 
} 
+0

I auszuführen so was. Hast du dieses Muster schon benutzt? Die Frage ist, ob es einige "technische" Ereignisse gibt, die ohne echte Benutzerinteraktion verarbeitet werden? – mtraut

+0

Ich habe es nicht verwendet, um Idle-ness zu erkennen, aber ich habe es in Fällen verwendet, in denen ich Ereignisse im Haupt-Thread manuell verarbeiten muss, ohne die Kontrolle darüber zu verlieren. – JesperE

2

Die Eclipse IDE hat bereits etwas ähnliches Garbage Collection, werfen Sie einen Blick auf die Klasse org.eclipse.ui.internal.ide.application.IDEIdleHelper in Bundle org.eclipse.ui.ide.application

+0

Danke - diese Klasse bestätigt, was mtraut oben gesagt hat. – ssnyder

Verwandte Themen