Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [Java e TaskManager]:Problema Win2000

    Ragazzi ho un problemone!
    un mio programma deve controllare che non ci siano altre istanze di esso in esecuzione al momento che viene lanciato. per far questo si appoggia alla lista dei processi, controllando che non ci siano altre applicazioni "javaw.exe" in esecuzione. sò per certo che sul tale pc gira soltanto quella applicazione java, quindi è semplice, apre la lista processi con il comando "tasklist" esamina la lista ecc ecc.. il problema è che su windows 2000 (la macchina dove dovrà girare la mia applicazione) il comando tasklist non è risconosciuto!!!
    Avete suggerimenti? o soluzioni per ovviare al problema?
    Ringrazio anticipatamente!

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [Java e TaskManager]:Problema Win2000

    Originariamente inviato da Aramil89
    un mio programma deve controllare che non ci siano altre istanze di esso in esecuzione al momento che viene lanciato.

    Avete suggerimenti? o soluzioni per ovviare al problema?
    In generale una soluzione è usare una "risorsa" globale esclusiva. In Java la cosa più semplice è usare un ServerSocket su una certa porta.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3

    Re: [Java e TaskManager]:Problema Win2000

    Originariamente inviato da Aramil89
    Ragazzi ho un problemone!
    un mio programma deve controllare che non ci siano altre istanze di esso in esecuzione al momento che viene lanciato. per far questo si appoggia alla lista dei processi, controllando che non ci siano altre applicazioni "javaw.exe" in esecuzione. sò per certo che sul tale pc gira soltanto quella applicazione java, quindi è semplice, apre la lista processi con il comando "tasklist" esamina la lista ecc ecc.. il problema è che su windows 2000 (la macchina dove dovrà girare la mia applicazione) il comando tasklist non è risconosciuto!!!
    Avete suggerimenti? o soluzioni per ovviare al problema?
    Ringrazio anticipatamente!
    Io personalmente ho utilizzato JUnique è una libreria che può essere usata per impedire che un utente avvii simultaneamente più istanze della stessa applicazione Java, non mi ha dato problemi anche su Win2000.
    La puoi trovare qui

  4. #4
    uhmm è vero.. non ci avevo pensato!
    Vedo se riesco a risolvere cosi allora!
    Grazie ancora

    allora, modifico qui cosi da non fare doppi post.
    Per quanto riguarda Junique ringrazio ma non voglio sconvolgere il programma (gia abbastanza complicato di suo), a meno che non si renda proprio necessario.
    Posso invece richiedere un esempio su come utilizzare le serversocket consigliatemi da andbin?

  5. #5

    Aggiornamento

    Vi aggiorno sul problema:
    Ho utilizzato JUnique e mi sembra funzionare correttamente quindi la tengo come ultima soluzione, però mi è stato chiesto di fare il possibile per lavorare con i processi di windows.
    Qualche suggerimento? ho trovato un metodo che esegue un exec("tasklist") ma il maledetto win2000 non ha il tasklist e quindi è andato in fumo..
    sono alla disperata ricerca di qualche altro modo ma non riesco a trovare nulla che cooperi con i processi di windows senza utilizzare il comando tasklist...

  6. #6

    Re: Aggiornamento

    Originariamente inviato da Aramil89
    Vi aggiorno sul problema:
    Ho utilizzato JUnique e mi sembra funzionare correttamente quindi la tengo come ultima soluzione, però mi è stato chiesto di fare il possibile per lavorare con i processi di windows.
    Qualche suggerimento? ho trovato un metodo che esegue un exec("tasklist") ma il maledetto win2000 non ha il tasklist e quindi è andato in fumo..
    sono alla disperata ricerca di qualche altro modo ma non riesco a trovare nulla che cooperi con i processi di windows senza utilizzare il comando tasklist...
    Googlando un po ho trovato un esempio che non utilizza il tasklist, ma crea un VBScript on-the-fly che ritorna la lista dei processi attivi, mi sembra un ottima soluzione al tuo caso visto che sei fissato sui processi, eccolo qua:
    codice:
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileWriter;
    import java.io.InputStreamReader;
    import java.util.*;
    
    public class VBSUtils {
      private VBSUtils() {  }
    
      public static List<String> listRunningProcesses() {
        List<String> processList = new ArrayList<String>();
        try {
    
            File file = File.createTempFile("realhowto",".vbs");
            file.deleteOnExit();
            FileWriter fw = new java.io.FileWriter(file);
    
            String vbs = "Set WshShell = WScript.CreateObject(\"WScript.Shell\")\n"
                       + "Set locator = CreateObject(\"WbemScripting.SWbemLocator\")\n"
                       + "Set service = locator.ConnectServer()\n"
                       + "Set processes = service.ExecQuery _\n"
                       + " (\"select name from Win32_Process\")\n"
                       + "For Each process in processes\n"
                       + "wscript.echo process.Name \n"
                       + "Next\n"
                       + "Set WSHShell = Nothing\n";
    
            fw.write(vbs);
            fw.close();
            Process p = Runtime.getRuntime().exec("cscript //NoLogo " + file.getPath());
            BufferedReader input =
                new BufferedReader
                  (new InputStreamReader(p.getInputStream()));
            String line;
            while ((line = input.readLine()) != null) {
                processList.add(line);
            }
            input.close();
        }
        catch(Exception e){
            e.printStackTrace();
        }
        return processList;
      }
    
      public static void main(String[] args){
        List<String> processes = VBSUtils.listRunningProcesses();
        String result = "";
    
        Iterator<String> it = processes.iterator();
        int i = 0;
        while (it.hasNext()) {
           result += it.next() +",";
           i++;
           if (i==10) {
               result += "\n";
               i = 0;
           }
        }
        msgBox("Running processes : " + result);
      }
    
      public static void msgBox(String msg) {
        javax.swing.JOptionPane.showConfirmDialog((java.awt.Component)
           null, msg, "VBSUtils", javax.swing.JOptionPane.DEFAULT_OPTION);
      }
    }

  7. #7
    Intanto ti ringrazio per il tempo speso per darmi una mano!
    Secondo poi è che sono "fissato" con i processi, è che mi sono stati richiesti specificatamente dal mio superiore. (gli ho mandato la documentazione di JUnique, magari mi passa quella cosi sto a posto).
    Grazie ancora!

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Aggiornamento

    Originariamente inviato da Aramil89
    non riesco a trovare nulla che cooperi con i processi di windows senza utilizzare il comando tasklist...
    Le seguenti soluzioni sono tutte altamente "system dependent":
    a) Usi JNI (Java Native Interface) per realizzare una tua libreria "nativa" che invoca le funzioni specifiche del S.O. per elencare/gestire i processi.
    b) Usi una libreria esterna già fatta/pronta per elencare/gestire i processi (che sicuramente fa uso di JNI).
    c) Invochi una applicazione o script esterno, anche non "standard" del sistema e che magari puoi sviluppare tu per ottenere (in vari modi ... tramite standard output, file ecc...) le informazioni che ti servono.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.