2017-01-30 20 views
0

私は、ランタイムEXECを使用してコマンドを呼び出して、explorer.exeの現在のメモリ使用量を取得しているコードを持っています。次に、その行全体を文字列変数に変換します。この文字列が変更されているかどうかを確認できます。これは、数字であるメモリ部分が時間とともに変化するかどうかをチェックするためです。目的は、エクスプローラが使用されているかどうかを確認することです。メモリの使用が変更されていない限り、エクスプローラは使用されていませんが、使用されている場合は使用中であることを意味します。文字列の値が変化するかどうかをチェック

コマンドの通常の出力はexplorer.exe 776 console 1 35,804Kで、最後の部分35,804Kがメモリ出力です。これは、監視または追跡したい部分です。

私が現在持っているコードは、下記のものです。当初は、Timerを実装して、常に実行するようにしました。

public class ReadProcser { 

    static String runTVal = ""; 

    public static void main(String[] args) { 
     try { 
     functionReadRegular(); 
     } finally { 
     if (runTVal != runTVal) 
     { 
     System.out.println("Changed"); 
     } 
     } 
    } 

    static void functionReadRegular(){ 
     try { 
      String process; 
      Process p = Runtime.getRuntime().exec("cmd /c tasklist /FI \"IMAGENAME eq explorer.exe\""); 
      BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); 
      while ((process = input.readLine()) != null) { 
       runTVal = process; 
       System.out.println(runTVal); 
      } 
      input.close(); 
     } catch (Exception err) { 
      err.printStackTrace(); 
     } 
    } 

} 

私は、文字列が変更されているかどうかを確認する現在の方法では動作しないことを承知しています。私は何をしようとしているのかをもっと見ることができます。現在、それは最初から価値がないので、比較するものはありません。しかし、それは私が達成しようとしていることを示すより多くです。私は文字列が変更されたかどうかを確認する特定のListenerを持っていることについて何かを見ましたが、実際にこのような場合にどのように実際に使用するかはわかりません。

コードで十分に見えない場合は、基本的には文字列runTValを取得してから保存してからもう一度コードを実行して新しい値をrunTValとして取得してから新しい。

+0

あなたの前提は一般的にはうまくいくかもしれませんが、何らかの理由でExplorerのメモリ使用量がまだ使用されているにもかかわらず変更されない場合、どのように処理する予定ですか? –

+0

文字列が不変で、文字列を比較する方法も学ぶ –

答えて

0

私はそれを理解しているので、そのCMDコマンドの出力をループ内で比較し、時間の経過とともに結果を確認しようとしています。

以下では、コマンドの値を読み取り、500ミリ秒待ってから、前の値と新しい値を比較するようにコードを修正しました。メモリだけでなく、フィールドのいずれかが変更されている可能性があります。しかし、私はこれがあなたがしようとしていることの方向への一歩かもしれないと思う。

import java.io.BufferedReader; 
import java.io.InputStreamReader; 

public class ReadProcser { 

    private static final int TIME_WAIT = 500; 

    public static void main(String[] args) { 
     while (true) { 
      String val = getRunTVal(); 
      try { 
       Thread.sleep(TIME_WAIT); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      if (!val.equals(getRunTVal())) { 
       System.out.println("Changed"); 
      } 
     } 
    } 

    public static String getRunTVal() { 
     String runTVal = null; 
     try { 
      String process; 
      Process p = Runtime.getRuntime().exec("cmd /c tasklist /FI \"IMAGENAME eq explorer.exe\""); 
      BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); 
      while ((process = input.readLine()) != null) { 
       runTVal = process; 
       System.out.println(runTVal); 
      } 
      input.close(); 
     } catch (Exception err) { 
      err.printStackTrace(); 
     } 
     return runTVal; 
    } 

} 

ティムBiegeleisenが述べたように、これは信頼できないかもしれない場合があります。たとえば、メモリ以外のフィールド(セッション番号や空白の量など)が出力で変更された場合、メモリが同じままであっても、メッセージ「変更済み」がコンソールに出力されます。

私はまったく助けましたか、あなたの意見を忘れましたか?

+0

は、ループ内で 'getRunTVal'を2回呼び出すのが少し不思議そうです –

+0

それは必要ではないでしょうか?あなたはスレッドがスリープする前と後で比較する必要があるので、前と後でそれを呼び出す必要があります。しかし、それを最適化する方法があるかもしれません。 –

+1

私はループの前に 'one call'を入れ、ループの中に' one call'を置いていました。また、私が変更した場合は 'val'を更新しました –

-3

文字列はオブジェクトなので、==または!=を呼び出すと、文字列はそこに格納されている値を比較します。例えば、整数は数値を保持しますが、オブジェクトはデータが格納されている場所を示す参照を比較します。したがって、たとえ両方の文字列が同じものであっても、それらは異なる場所に格納されているので等しくはありません。格納するものを比較するには、if(stringA.equals(stringB))のような.equalsを使用します。

関連する問題