IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Process persistant même après l'arrêt de l'application Java


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 118
    Par défaut Process persistant même après l'arrêt de l'application Java
    Bonjour,

    je souhaite développer en VC++ sous Visual Studio 2005, pour une plateforme Windows, un petit programme permettant de lancer une application java.

    Mon programme se lance bien mais par contre, même si j'arrête mon programme java, le thread java continue à tourner...

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    29
    30
    31
    int APIENTRY _tWinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPTSTR    lpCmdLine,
                         int       nCmdShow)
    {
           // En réalité, le pointeur commandeDos se construit dynamiquement en  fonction de la première JRE trouvée dans le répertoire jre
           char* commandeDos = ".\\jre\\jre1.6.0_07\\bin\\javaw.exe"
     
           // Conversion d'un char* en LPWSTR
           size_t nSize1 = 1 + strlen( commandeDos );
           LPWSTR wCmdeDos = new WCHAR[nSize1];
           mbstowcs( wCmdeDos, commandeDos, nSize1 );
     
           // Libération de la mémoire...
           free(commandeDos);
     
           // Creation d'un processus
           STARTUPINFO         siStartupInfo;
           PROCESS_INFORMATION piProcessInfo;
     
           memset(&siStartupInfo, 0, sizeof(siStartupInfo));
           memset(&piProcessInfo, 0, sizeof(piProcessInfo));
           siStartupInfo.cb = sizeof(siStartupInfo);
     
           if(CreateProcess(NULL,wCmdeDos,NULL,NULL,0, NORMAL_PRIORITY_CLASS, NULL, NULL, &siStartupInfo, &piProcessInfo) == FALSE) {
    	       // erreur
                  MessageBox(NULL, _T("Impossible de lancer l'application java..."), _T("Erreur..."), MB_OK + MB_ICONERROR);
                  return 1;
           }
           return 0;
    }
    Ce bout de code fonctionne mais je ne comprends pas, le thread javaw continue à tourner même après l'arrêt de l'application.
    Par contre, le processus du programme VC++ s'arrête bien dès le lancement de l'application java.

    Avez-vous une idée pour corriger le problème du processus persistant ?

    Merci,
    F.

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par Foub Voir le message
    Avez-vous une idée pour corriger le problème du processus persistant ?
    Ca sent plutot un problême coté Java....
    Est-ce que la même application java fonctionne (sans le bout de code C++) ?
    Si oui, alors il doit y a une subtilité de JRE, de settings et de classpaths (voir de répertoire courant)...
    Si non, alors il faut débugger l'appli java pour voir quel thread empêche la machine virtuelle de quitter.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 118
    Par défaut
    Bonjour nicroman,

    >> Est-ce que la même application java fonctionne (sans le bout de code C++) ?
    Oui, sans aucun problème et le process Java s'arrête bien quand je quitte l'application.

    >> Si oui, alors il doit y a une subtilité de JRE, de settings et de classpaths (voir de répertoire courant)...
    >> Si non, alors il faut débugger l'appli java pour voir quel thread empêche la machine virtuelle de quitter.

    Pourtant, l'application java produit le résultat attendu et affiche mon popup de test... Il n'y a pas d'autre thread créé que l'EDT.
    Si j'avais un problème de répertoire, l'application java refuserait de se lancer.

    Par contre, bizarrement, si je modifie le code C++ de la façon suivante, le thread s'arrete bien après l'arrêt de l'application java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    29
    30
     
           /*
           // En réalité, le pointeur commandeDos se construit dynamiquement en fonction de la première JRE trouvée dans le répertoire jre
           char* commandeDos = ".\\jre\\jre1.6.0_07\\bin\\javaw.exe"
     
           // Conversion d'un char* en LPWSTR
           size_t nSize1 = 1 + strlen( commandeDos );
           LPWSTR wCmdeDos = new WCHAR[nSize1];
           mbstowcs( wCmdeDos, commandeDos, nSize1 );
     
           // Libération de la mémoire...
           free(commandeDos);
           */
     
           LPWSTR wCmdeDos = _T("javaw -jar lanceur.jar");
     
           // Creation d'un processus
           STARTUPINFO         siStartupInfo;
           PROCESS_INFORMATION piProcessInfo;
     
           memset(&siStartupInfo, 0, sizeof(siStartupInfo));
           memset(&piProcessInfo, 0, sizeof(piProcessInfo));
           siStartupInfo.cb = sizeof(siStartupInfo);
     
           if(CreateProcess(NULL,wCmdeDos,NULL,NULL,0, NORMAL_PRIORITY_CLASS, NULL, NULL, &siStartupInfo, &piProcessInfo) == FALSE) {
    	       // erreur
                  MessageBox(NULL, _T("Impossible de lancer l'application java..."), _T("Erreur..."), MB_OK + MB_ICONERROR);
                  return 1;
           }
           return 0;
    Mais là, on sort de ce que je veux faire ; je veux pouvoir sélectionner la première JRE trouvé dans le répertoire JRE à partir du répertoire courant de l'exécutable.

    Je ne vois pas trop...

    Merci pour votre aide,
    F.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 118
    Par défaut
    Pour avoir réécrit ce bout de code en VB6, je suis désormais certain de que le problème vient de mon code C++ car je ne reproduit pas le problème en VB6.

    Avez-vous une idée ?

  5. #5
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Les deux programmes ne font pas la même chose....
    L'un appelle simplement javaw.exe, l'autre avec les paramètres -jar lanceur.jar !

    Ensuite, le free(commandDos) sur une chaine statique... bof bog...Il est très étonnant d'ailleurs, que le runtime debug n'ai pas immédiatement râlé...
    Maintenant, il se peut que ce soit une erreur de copier/coller (vu que tu dis que commandDos est dynamique). Dans tous les cas, as-tu essayé le code pasté ?

    Ensuite les handles récupérés dans le process-info doivent être fermés:
    Citation Envoyé par MSDN
    Handles in PROCESS_INFORMATION must be closed with CloseHandle when they are no longer needed.
    Ensuite tu mélanges les LPWSTR (pointeur de caractères unicode) avec les _T (pointeur de caractères variables)... Ce qui ne marchera que si l'application est en mode UNICODE.
    Autant tout conserver en UNICODE et appeler CreateProcessW dans ce cas (c'est quand même ce qu'il y a de mieux).

    Sinon, c'est LPTSTR qu'il faut utiliser, et aucune conversion n'est alors nécessaire.

Discussions similaires

  1. Problème arrêt d'une application java en windows services
    Par Estelle_32 dans le forum Général Java
    Réponses: 6
    Dernier message: 20/10/2010, 11h52
  2. Le script continu à trouner même après avoir fermer le navigateur
    Par sami_c dans le forum Serveurs (Apache, IIS,...)
    Réponses: 1
    Dernier message: 01/07/2008, 14h40
  3. Réponses: 2
    Dernier message: 08/05/2008, 07h24
  4. Forcer réplication après l'arrêt d'un des sites maîtres
    Par ymerej dans le forum Entreprise Manager
    Réponses: 1
    Dernier message: 26/02/2007, 13h42
  5. [C#] Process toujours actif apres fermeture de la fenetre
    Par toxycyty dans le forum Windows Forms
    Réponses: 4
    Dernier message: 26/10/2006, 16h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo