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++Builder Discussion :

Interrompre une DLL


Sujet :

C++Builder

  1. #1
    Membre régulier
    Profil pro
    lkjlgj
    Inscrit en
    Février 2007
    Messages
    255
    Détails du profil
    Informations personnelles :
    Localisation : Angola

    Informations professionnelles :
    Activité : lkjlgj

    Informations forums :
    Inscription : Février 2007
    Messages : 255
    Points : 96
    Points
    96
    Par défaut Interrompre une DLL
    Bonjour !

    Dans une application C++ Builder je lance une DLL que je souhaite pouvoir interrompre parfois avant la fin de son traitement.

    Je ne trouve pas de reponse a base de SendMessage mais plutot a partir de Threads qui sont parait-il faciles a interrompre.

    Etant donne que je veux seulement implementer un bouton / message CANCEL pour ma DLL, dois-je inserer celle-ci dans un Thread ?

    Vous procedeez comment habituellement ?

    Merci et bonne nuit !

  2. #2
    Membre actif Avatar de Argol_Medusa
    Homme Profil pro
    Ingénieur Radiofréquences
    Inscrit en
    Août 2005
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Radiofréquences
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 208
    Points : 242
    Points
    242
    Par défaut
    En fait personnellement je m'arrange pour que ma DLL puisse s'interrompre d'elle-même en plein milieu d'un traitement.
    De manière générale tout traitement qui "prend tu temps" ou "a des chances de figer" doit être codé de manière à pouvoir rendre la main à tout moment.
    Une simple condition de sortie sur une valeur d'un boolean suffit.

    Par là j'entends par exemple une boucle for de traitement avec de très nombreuses itérations, dans laquelle on test si une demande d'arrêt a été effectuée ( via mutex dans le cas de threads ).
    Et pas un arret par killage de thread comme on le voit malheureusement souvent , c'est sur ça arrete mais bon ... c'est pas propre, par contre on a malheureusement parfois pas trop le choix.

    Un cas typique : si la DLL n'est pas à toi.
    Là c'est différent, et donc là tu peux tout mettre dans un thread indépendant de ton interface graphique ou du restant du programme, comme ça si la DLL fige ou ne répond plus, tu peux la killer, c'est dégueux mais bon si tu n'as pas le code source de la DLL et que tu ne peux pas la modifier, je ne vois pas d'autre solutions.

    (Après il y a peut-etre d'autres manières de faire mais je ne connais que ça.)
    Désolé, on savait pas que c'était impossible, alors on l'a fait

  3. #3
    Membre régulier
    Profil pro
    lkjlgj
    Inscrit en
    Février 2007
    Messages
    255
    Détails du profil
    Informations personnelles :
    Localisation : Angola

    Informations professionnelles :
    Activité : lkjlgj

    Informations forums :
    Inscription : Février 2007
    Messages : 255
    Points : 96
    Points
    96
    Par défaut
    Merci Argol_Medusa,

    Je suis d'accord sur l'utilité relative d'un Thread dans mon cas : ma DLL renvoie souvent des messages d'info et d'actualisation de jauge à ma fenêtre principale mais inversement ne devrait recevoir qu'un seul message depuis la fenêtre à savoir "interruption demandée par l'utilisateur". Dans ce cas je suppose qu'un simple processus de vérification de messages devrait suffire.

    Mais, je n'arrive pas à implémenter la réception de ce message !?!

    Dans ma DLL j'ai (comme tu suggères) un booléen qui est vérifié régulièrement et qui est modifiable par un message extérieur, mais, rien n'y fait...Quelqu'un a une idée ?


    J'ai défini cette fonction dans ma DLL comme suit :
    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
     
     
    Dans le fichier .h :
     
    int processDLLMsg(TMessage&);
    BEGIN_MESSAGE_MAP
    MESSAGE_HANDLER(_WM_DLLMSG, TMessage, processDLLMsg)
    END_MESSAGE_MAP(tokenizer)
     
    Dans le fichier .cpp :
     
    int myDLL::processDLLMsg(TMessage &Message)
    {
    	if(Message.LParam == _MSG_ABORT)
    		abortJob=true;
    }
     
    Depuis la fenêtre principale, j'envoie le message suivant :
     
    SendMessage(winHandle, _WM_DLLMSG, 0, (LPARAM)(LPCTSTR)_MSG_ABORT);

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 229
    Points : 79
    Points
    79
    Par défaut
    Heu pourquoi ne pas tout simplement exporter une fonction qui fait le boulot que tu souhaite et que tu appelles de ta fenêtre principale??

    dans la dll
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern "C" __declspec(dllexport) bool __stdcall abort();
    dans la fenêtre principale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern "C" __declspec(dllimport) bool __stdcall abort();
    Pascale38

  5. #5
    Membre actif Avatar de Argol_Medusa
    Homme Profil pro
    Ingénieur Radiofréquences
    Inscrit en
    Août 2005
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Radiofréquences
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 208
    Points : 242
    Points
    242
    Par défaut
    Je ne me rappelle plus le fonctionnement des messages, donc ce que je dis est à prendre avec des pincettes, mais il est possible que le message ne soit pas mis à jour tant que tu es dans ta boucle principale de traitement.
    Ce n'est peut-être qu'une fois que tu sors que tu obtiens la nouvelle valeur, ceci expliquerait cela.

    Mais je rejoins l'avis de Pascale38, ajoute une fonction permettant de quitter dans ta DLL, c'est le plus simple je crois.
    Désolé, on savait pas que c'était impossible, alors on l'a fait

Discussions similaires

  1. Interrompre le traitement effectué par une DLL
    Par Négrier dans le forum Langage
    Réponses: 2
    Dernier message: 07/03/2015, 00h08
  2. pb de récup de handle à partir d'une dll
    Par yokito dans le forum Langage
    Réponses: 2
    Dernier message: 20/08/2002, 12h29
  3. Utilisation d'une dll écrite en delphi 5 dans VB6
    Par Jean-Louis dans le forum Langage
    Réponses: 4
    Dernier message: 05/08/2002, 09h19
  4. Declarer une dll Delphi ?
    Par DelphiCool dans le forum C++Builder
    Réponses: 2
    Dernier message: 26/07/2002, 10h07
  5. Equivalent à ExeName pour une DLL
    Par Smortex dans le forum Langage
    Réponses: 7
    Dernier message: 16/07/2002, 21h07

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