05. april 2000 - 17:23 Der er 6 kommentarer og
1 løsning

Processer i Windows

Jeg er i en situation, hvor jeg gerne vil vide hvornår en hvilken som helst windows applikation bliver lukket ned. Det er meningen at et javaprogram skal lytte eller observe på processerne i systemet.

Indtil videre har jeg prøvet at få et object af klassen Process ud ved at kalde funktionen Runtime.getRuntime.Exec(programmet navn). Herefter startes programmet op, og referencen til det ligger i en return værdi af klassen Process. Klassen Process og klassen Runtime er med i Java API'et.

Jeg har nu tænkt over flere måder man kunne opfange at Process objektet blev lukket:

1. Man kunne teste på objektet af klassen Process i en løkke om objektet stadig var til rådighed. Af en eller anden grund virker dette ikke. Det var ellers meget logisk.

2. Man kunne implementere en klasse som extendede den abstrakte Process klasse og og overridede funktionen finalize(). Finalize kaldes af garbageCollectoren når et objekt nedlægges, og det vil derfor være oplagt at opfange nedlæggelsen processen her. Problemet med denne løsning er at der bare kommer en nullPointerException som jeg ikke rigtig fatter hvor kommer fra.

3. Man kunne konstant løbe alle processer i systemet igennem ved at kalde  Win32 funktioner igennem JNI. Problemet med den løsning er at den er besværlig, svær at implementere, ressourcekrævende og desuden platformafhængig.

Hvorfor virker det ikke det jeg har prøvet? Er der nogle som har andre løsninger på problematikken? Kan nogen hjælpe mig? Er det overhovedet Process klassen jeg skal arbejde med ?

mvh. Process Manager ansvarlig SoftIC:)
05. april 2000 - 17:25 #1
Efterfølgende er her de tre klasser i et eksempel skrevet i jbuilder3.
05. april 2000 - 17:26 #2
package untitled2;

import javax.swing.UIManager;

public class Application1 {
  boolean packFrame = false;
  public static Frame1 frame;
  //Construct the application
  public Application1() {
  frame = new Frame1();
    //Validate frames that have preset sizes
    //Pack frames that have useful preferred size info, e.g. from their layout
    if (packFrame)
      frame.pack();
    else
      frame.validate();
    frame.setVisible(true);
  }

  //Main method
  public static void main(String[] args) {
    try  {
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    }
    catch(Exception e) {
    }
    new Application1();
  }
}
05. april 2000 - 17:27 #3
package untitled2;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import com.borland.jbcl.layout.*;

public class Frame1 extends JFrame {
  public static Process prs;
  public static MyProcess myPrs;
  XYLayout xYLayout1 = new XYLayout();
  JButton buttonÅbn = new JButton();
  JButton buttonLyt = new JButton();
  JButton buttonMyÅbn = new JButton();
  JLabel labelStatus = new JLabel();

  //Construct the frame
  public Frame1() {
    enableEvents(AWTEvent.WINDOW_EVENT_MASK);
    try  {
      jbInit();
    }
    catch(Exception e) {
      e.printStackTrace();
    }
  }

  //Component initialization
  private void jbInit() throws Exception  {
    buttonÅbn.setText("Åbn notepad");
    buttonÅbn.addActionListener(new java.awt.event.ActionListener() {

      public void actionPerformed(ActionEvent e) {
        buttonÅbn_actionPerformed(e);
      }
    });
    this.getContentPane().setLayout(xYLayout1);
    this.setSize(new Dimension(400, 300));
    this.setTitle("Frame Title");
    buttonLyt.setText("Lyt på notepad");
    buttonLyt.addActionListener(new java.awt.event.ActionListener() {

      public void actionPerformed(ActionEvent e) {
        buttonLyt_actionPerformed(e);
      }
    });
    buttonMyÅbn.setText("MyÅbn Notepad");
    buttonMyÅbn.addActionListener(new java.awt.event.ActionListener() {

      public void actionPerformed(ActionEvent e) {
        buttonMyÅbn_actionPerformed(e);
      }
    });
    labelStatus.setText("Notepad lukket");
    this.getContentPane().add(buttonÅbn, new XYConstraints(38, 19, 118, 26));
    this.getContentPane().add(buttonMyÅbn, new XYConstraints(20, 69, 165, 31));
    this.getContentPane().add(buttonLyt, new XYConstraints(31, 117, 122, 28));
    this.getContentPane().add(labelStatus, new XYConstraints(4, 243, 168, 30));
  }

  //Overridden so we can exit on System Close
  protected void processWindowEvent(WindowEvent e) {
    super.processWindowEvent(e);
    if(e.getID() == WindowEvent.WINDOW_CLOSING) {
      System.exit(0);
    }
  }

  void buttonÅbn_actionPerformed(ActionEvent e) {
  try{
        Process p = Runtime.getRuntime().exec("C:\\windows\\notepad.exe");
        prs = p;
    }
    catch(java.io.IOException exc)
    {
      System.out.println(exc);
    }
    labelStatus.setText("Notepad er åbnet med Process");
  }

  void jButton2_actionPerformed(ActionEvent e) {
    prs.destroy();
    labelStatus.setText("Notepad er lukket med Process");
  }

  void buttonLyt_actionPerformed(ActionEvent e) {
    while (prs!=null)
    {
    }
    labelStatus.setText("Notepad er lukket (lyt)");
  }

  void jButton5_actionPerformed(ActionEvent e) {
 

  }

  void buttonMyÅbn_actionPerformed(ActionEvent e) {
  try{
    MyProcess ps = ((MyProcess)Runtime.getRuntime().exec("C:\\windows\\notepad.exe"));
    myPrs=ps;
  }catch(java.io.IOException exs)
  {
    System.out.println(exs);
  }
  labelStatus.setText("Notepad er åbnet med MyProcess");
  }
}
05. april 2000 - 17:27 #4
package untitled2;

public abstract class MyProcess extends Process{

  protected void finalize() throws Throwable
{
  Application1.frame.labelStatus.setText("Notepad er lukket(MyProcess)");
}

}
05. april 2000 - 17:28 #5
Nu skulle der vidst ikke være tvivl om hvad problemet er.
Avatar billede el_gnu Nybegynder
13. august 2000 - 11:24 #6
Er spørgsmålet stadig aktuelt.
Hvis ikke så luk det!!!
17. august 2000 - 15:48 #7
Spørgsmålet er så lukket?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester