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

Dotnet Discussion :

Comment stopper un thread qui fait des appels natifs ?


Sujet :

Dotnet

  1. #1
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 369
    Points : 40 164
    Points
    40 164
    Par défaut Comment stopper un thread qui fait des appels natifs ?
    Salut,

    J'ai un cas un peu particulier à vous soumettre :

    Considérons un code C++ contenant une méthode C++ très longue à exécuter (potentiellement plusieurs heures).
    Ce code C++ est encapsulé dans une DLL pour être appelé depuis du code c# via un wrapper.
    Côté C#, dans un thread, j'appelle cette fonction C++ très longue via son wrapper.

    Comment faire pour forcer l'arrêt du thread c# sachant que bien sûr, le code C++ sous-jacent n'aura pas terminé de s'exécuter ?
    J'ai essayé un thread.Abort() mais le code C++ continue à tourner. J'ai lu que le Thread.Abort() du CLR n'était capable d'arrêter que les instructions qu'il gèrait, ce qui expliquerait pourquoi le traitement C++ ne s'arrête pas, quelle serait alors la bonne manière de procéder ?

    Quelqu'un a-t-il une idée ?

  2. #2
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 16
    Points : 19
    Points
    19
    Par défaut
    Fais un kill !

    Sinon plus sérieusement tu sais diviser cette longue fonction ? comme ça tu sais arrêter le thread après x minutes au lieu de x heures ...

  3. #3
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 369
    Points : 40 164
    Points
    40 164
    Par défaut
    Non, je n'ai pas la main sur le code C++, je ne peux pas le modifier.

  4. #4
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Bonjour

    Une possibilité setait peut êter de créer un AppDomain secondaire qui se chargera de l'appel de la fonction C++ et pourra être déchargé à la demande.


    Un truc comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    			string myAssemblyName = "assembly_appelant_fonction_cpluplus";
    			AppDomain domaine = AppDomain.CreateDomain("MySecondaryDomain");
    			domaine.Load(myAssemblyName);
    Puis, pur arrêter le tout :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    			AppDomain.Unload(domaine);

    A tester dans ce cas de figure, car je ne suis pas sur que cela fonctionne.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  5. #5
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 369
    Points : 40 164
    Points
    40 164
    Par défaut
    J'ai essayé cette idée, mais ça ne donne rien de plus. L'appdomain est bien déchargé, mais le traitement continue à courir

  6. #6
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par khayyam90 Voir le message
    J'ai essayé cette idée, mais ça ne donne rien de plus. L'appdomain est bien déchargé, mais le traitement continue à courir

    Tu es sur que tu inities bien le traitement dans le domaine secondaire ?

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  7. #7
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 369
    Points : 40 164
    Points
    40 164
    Par défaut
    J'ai fait un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private AppDomain threadedDomaine;
    puis un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    threadedDomaine.Load(Assembly.GetExecutingAssembly().FullName);
    en première ligne du thread (aussi essayé juste avant l'appel du thread)

    et un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AppDomain.Unload(threadedDomaine);
    juste avant le thread.abort()

    ça ne donne rien

  8. #8
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Une technique assez simple conceptuellement est de faire en sorte que le programme natif écoute (listen) un socket sur lequel on lui enverra l'éventuel ordre STOP.
    Donc dans un thread if fait son travail principal, dans un autre il attend qu'on lui donne l'ordre de stopper.
    Quand le code est conçu de la sorte dès le départ, il est évidemment trivial d'arrêter proprement le travail.

    Mais dans votre cas, ne pouvant modifier le code natif, vous pouvez écrire un autre code natif qui servira de contrôleur : ce nouveau code utilisera le principe d'écoute du socket mais au lieu d'effectuer le travail dans un autre thread, il lancera le code natif original en tant que sous-process.
    Lorsque l'éventuel ordre STOP lui arrivera sur le socket, il lui suffira de tuer son sous-process, ce qui normalement arrive naturellement si lui en tant process père sort.
    Donc l'inconvénient est d'avoir 2 sous-process au lieu d'un, mais l'avantage est d'avoir un contrôleur ré-utilisable pour peu que celui-ci reçoive le path du sous-process original à lancer en paramètre.

Discussions similaires

  1. Réponses: 3
    Dernier message: 07/05/2010, 13h54
  2. comment fermer un site qui contient des framesets
    Par zana74 dans le forum Langage
    Réponses: 6
    Dernier message: 20/08/2006, 16h45
  3. Pop up qui fait des siennes !
    Par Sandara dans le forum Général JavaScript
    Réponses: 14
    Dernier message: 13/06/2006, 16h40
  4. Réponses: 6
    Dernier message: 11/05/2006, 16h00
  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