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

Windows Forms Discussion :

[VB.NET] Comment fermer mon Thread qui a lancé une appli Matlab ?


Sujet :

Windows Forms

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 19
    Points : 11
    Points
    11
    Par défaut [VB.NET] Comment fermer mon Thread qui a lancé une appli Matlab ?
    Bonjour,

    Mon cas est très simple, je lance un calcul Matlab à partir d'un thread :

    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
     
     
    Imports System.Threading
     
    Private _threadMatlab As Thread
     
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     
            ' Matlab Analysis
            _threadMatlab = New Thread(AddressOf startMatlab)
            _threadMatlab.Start()
     
    End Sub
     
    Private Sub startMatlab()
     
            Dim Matlab As Object
     
            ' Launching Matlab
            Matlab = CreateObject("Matlab.Application")
     
            Matlab.Execute("Run.m")
     
            Matlab.quit()
     
    End Sub
    Lorsque je ferme mon formulaire le thread continue à tourner. Le problème c'est que Run.m dure près d'une heure et que je ne peux attendre la fin du script.

    Alors sur l'évenement FormClosing j'ai éssayé la méthode abort() et Matlab.quit() (si Matlab est déclaré global au formulaire) mais rien ne fonctionne...

    Comment killer mon Thread, i.e. arrêter le processus Matlab lorsque je quitte mon formulaire ?

  2. #2
    jab
    jab est déconnecté
    Rédacteur
    Avatar de jab
    Homme Profil pro
    SharePoint developpeur
    Inscrit en
    Février 2004
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : SharePoint developpeur
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 1 173
    Points : 4 339
    Points
    4 339
    Par défaut
    Probablement qu'execute attent la fin de l'opération demandée avant de continuer

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    238
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 238
    Points : 269
    Points
    269
    Par défaut
    La gestion des thread sous .Net est pas géniale.
    Tu peux utiliser un BackGroundWorker qui est en fait un Thread assister, ca te permettra d'utiliser les thread sans en avoir l'air.

    Le problème est que si ton thread est occupé (dans une méthode bloquante par exemple) il ne peux pas être Tuer directement via un abort.
    par contre tu peux spécifier que ton Thread est un Thread Background.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MonThread.IsBackground = true;
    De cette manière ton thread deviens dépendant des autres thread de ton appli. Il sera automatiquement tuer lorsque tous les autres thread ForeGround seront tuer.
    A la fermeture de ton appli ton thread sera tuer, quelque soit l'état du thread ce qui peut impliquer d'autres problèmes.

    Bonne chance
    « L’erreur est humaine, mais un vrai désastre nécessite un ordinateur »

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 19
    Points : 11
    Points
    11
    Par défaut
    jab : oui voilà, il y a bien deux choses : il y a mon thread qui lance une appli Matlab, ce qui fait qu'on peut rester "bloqué" 1h à la méthode execute() même si l'on a fermé le formulaire (qui a lancé le thread qui a lui-même lancé Matlab, car l'objectif est bien de killer Matlab) d'ailleurs dans le gestionnaire des tâches on voit le processus Matlab à 100% alors que l'IHM du formulaire, elle, a bien disparu.


    biloutor : il me semble que j'avais essayé la propriété IsBackground mais je vais retenter pour être sûr...

  5. #5
    jab
    jab est déconnecté
    Rédacteur
    Avatar de jab
    Homme Profil pro
    SharePoint developpeur
    Inscrit en
    Février 2004
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : SharePoint developpeur
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 1 173
    Points : 4 339
    Points
    4 339
    Par défaut
    Désolé je viens de me rendre compte que je n'avait pas compris ta question.

    Regarde l'exemple que j'ai fait dans un tuto, tu devrais pouvoir t'an inspirer.
    http://jab.developpez.com/tutoriels/.../synchrone/#LB

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 19
    Points : 11
    Points
    11
    Par défaut
    biloutor : donc j'ai réessayé avec IsBackground mais ça ne fonctionne pas, il faudrait presque pouvoir assigner IsBackground à True au processus Matlab et non au Thread qui le lance, mais est ce possible sachant que Matlab n'est pas un thread dans mon code ?

    jab : ok je vais voir ton lien

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 19
    Points : 11
    Points
    11
    Par défaut
    Bon sachant que je suis obligé d'instancier un objet COM Matlab, que cette instanciation créée un processus Matlab qui empêche la fermeture de l'appli si celui-ci est en train de tourner (méthode execute) : je ne vois pas d'autre moyen que de killer directement le processus à la fermeture de l'appli...

    Inspiré du lien de Jab :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            'Je prend pour l'instant le premier processus Matlab en cours
            Dim procMatlab As Process = Process.GetProcessesByName("matlab")(0)
            With procMatlab
                If Not .HasExited Then
                    .Kill()
                    .WaitForExit()
                End If
                .Close()
            End With
    avec une gestion d'erreur du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                    Try
                        resMatlab = Matlab.Execute("Run.m")
                    Catch ex As COMException
                        Exit Sub
                    End Try
    Après comment différencier deux processus Matlab en train de tourner ?...
    Voilà, c'est assez barbare mais je ne vois pas d'autres solutions...

Discussions similaires

  1. [VB.NET] Comment supprimer un fichier qui est utilisé ?
    Par Toon94 dans le forum Windows Forms
    Réponses: 12
    Dernier message: 13/06/2010, 12h59
  2. Réponses: 1
    Dernier message: 13/08/2006, 13h17
  3. Réponses: 2
    Dernier message: 26/04/2006, 11h19
  4. [vb.net]comment fermer uniquement la form de demarrage
    Par bestsimo2 dans le forum Windows Forms
    Réponses: 15
    Dernier message: 02/06/2005, 17h29
  5. [Thread] comment arreter un thread qui execute une methode b
    Par Cyber@l dans le forum Concurrence et multi-thread
    Réponses: 8
    Dernier message: 04/08/2004, 10h51

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