Précédent   Forum des professionnels en informatique > Java > Développement Web en Java > Applets
Applets Vos questions sur les Applets
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/09/2011, 10h41   #1
Membre régulier
 
Avatar de kéraunos
 
Homme
Inscription : janvier 2005
Messages : 157
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : janvier 2005
Messages : 157
Points : 71
Points : 71
Par défaut Tuer un processus en cours

Bonjour à tous,

Mon applet, après avoir téléchargé un exécutable chez le client, lance l'exécution de cet exécutable à l'aide des commandes suivantes :

Windows :
C:\chemin\absolu\vers\executable.exe

Mac et Linux :
/chemin/absolu/vers/executable

(valeurs de executable.getAbsolutePath() - cf. code ci-dessous)

Version simplifiée du code :
Code :
1
2
3
4
5
6
7
8
9
 
 
Process pipeProcess;
 
List<String> commandList = new ArrayList<String>();
commandList.add(executable.getAbsolutePath());
 
ProcessBuilder processBuilder = new ProcessBuilder(commandList);
pipeProcess = processBuilder.start();
Ce que j'aimerais : pouvoir stopper le processus (équivalent d'une commande Unix kill) si le programme n'est pas totalement lancé au bout d'un certain temps. La manière de détecter si le programme est totalement lancé ou pas, ainsi que le délai : ça n'est pas un problème. Ce que je voudrais savoir, c'est s'il existe en Java un moyen d'arrêter le processus qu'on vient de lancer ?

Merci.
kéraunos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 10h51   #2
Membre chevronné
 
Inscription : février 2010
Messages : 580
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : février 2010
Messages : 580
Points : 727
Points : 727
Bonjour,

Oui c'est possible,
Ferme bien l'entrée la sortie standard du process et utilise la méthode destroy dessus.

Mais bon sous Windows, la documentation java précise bien que ça ne marche pas toujours, tout dépend ce que fait ton process.
Jimmy_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 11h30   #3
Membre régulier
 
Avatar de kéraunos
 
Homme
Inscription : janvier 2005
Messages : 157
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : janvier 2005
Messages : 157
Points : 71
Points : 71
Bonjour Jimmy, merci pour ta réponse.

Pourrais-tu détailler ce que tu entends par bien fermer l'entrée et la sortie standard du process ?

Dans mon cas, l'objet pipeProcess est notamment utilisé pour ouvrir un pipe et communiquer avec le programme que l'applet lance :

(suite du code de mon précédent message)

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 
 
Writer pipeWriter = new OutputStreamWriter(pipeProcess.getOutputStream());
pipeWriter.append("<communication>Hello!</communication>");
pipeWriter.flush()
 
BufferedReader reader = new BufferedReader(new InputStreamReader(pipeProcess.getInputStream()));
 
// attendre 20s que l'executable se lance
// quand l'executable se lance, il envoie un message a l'applet
// et le reader devient ready
long t0, t1;
t0 =  System.currentTimeMillis();
t1 = t0;
while( !reader.ready() && (t1-t0)<20000 ) {
    t1 =  System.currentTimeMillis();
}
// si les 20s sont atteintes ET que l'executable N'est PAS lance
// alors kill son processus :
if(!reader.ready()) {
    // [ L'OBJET DE MA DEMANDE SUR CE FORUM ]
}
// si l'executable est lance avant 20,001s
// alors lire son message :
else {
    String responseLine = reader.readLine();
    // etc...
}
kéraunos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 11h43   #4
Membre chevronné
 
Inscription : février 2010
Messages : 580
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : février 2010
Messages : 580
Points : 727
Points : 727
Si pipeProcess est bien ton objet Process, tu dois faire un close sur l'InputStream et l'OutputStream associé.
Jimmy_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 14h21   #5
Membre régulier
 
Avatar de kéraunos
 
Homme
Inscription : janvier 2005
Messages : 157
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : janvier 2005
Messages : 157
Points : 71
Points : 71
Ça fonctionne nickel, merci.

Solution, donc : remplacer dans le code précédent
Code :
// [ L'OBJET DE MA DEMANDE SUR CE FORUM ]
Par :
Code :
1
2
3
pipeProcess.getInputStream().close();
pipeProcess.getOutputStream().close();
pipeProcess.destroy();
kéraunos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 14h47   #6
Membre chevronné
 
Inscription : février 2010
Messages : 580
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : février 2010
Messages : 580
Points : 727
Points : 727
J'adore quand un plan se déroule sans accro
Jimmy_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h26.


 
 
 
 
Partenaires

Hébergement Web