05. april 2000 - 17:23Der 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 ?
I dette særtema om aspekter af AI ser vi på skiftet fra sprogmodeller til AI-agenter, og hvordan virksomheder kan navigere i spændet mellem teknologisk hastighed og behovet for menneskelig kontrol.
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(); } }
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(); } }
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)"); }
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.