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

Langage Delphi Discussion :

Simple dll avec un Thread engendre une exception (en mode debug) lors du dechargement


Sujet :

Langage Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 37
    Points : 17
    Points
    17
    Par défaut Simple dll avec un Thread engendre une exception (en mode debug) lors du dechargement
    Bonjour à tous,

    j'ai une dll qui contient un thread, tout ce passe bien le thread marche comme il faut mais cependant lors du dechargement de la dll par l'application, cela génère un exception. J'ai fait pas mal de tests dans tout les sens possible mais la je bloque. Donc je suis revenu au basse et j'ai créé un exe et une dll minimum permettant de reporduire le problème. Pourtant même avec ça, je ne vois pas d'ou viens cette fichue exception. Donc je viens ici avec l'immense espoir que quelqu'un puisse m'aider et me dire ce qui ne va pas. c'est surement pas grand chose mais la j'ai beau ouvrir les yeux, je ne vois rien.

    Voici le code de l'appli:

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    unit uTest2;
     
    interface
     
    uses
      Windows,
      SysUtils,
      Variants,
      Classes,
      Graphics,
      Controls,
      Forms,
      Dialogs,
      StdCtrls;
     
    type
      TForm3 = class(TForm)
        Button1: TButton;
        Memo1: TMemo;
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form3: TForm3;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm3.Button1Click(Sender: TObject);
    var
      libHwnd:                  HWnd;
    begin
      libHwnd := LoadLibrary('InitDLL.dll');
      if libHwnd = 0 then
      begin
        memo1.Lines.Add('Could not find the dll file!');
        EXIT; {EXIT}
      end
      else
      begin
        memo1.Lines.Add('dll file find!');
      end;
      Sleep(1000);
      Application.ProcessMessages;
     
      freelibrary(libHwnd);
     
      memo1.Lines.add('Unload OK');
    end;
     
    end.
    et celui de la dll:

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    unit myDLL2;
     
    interface
     
    uses
      Windows,
      SysUtils,
      Classes;
     
     
    type TDllThread = class(TThread)
      private
      protected
        procedure Execute; override;
    end;
     
    var
      DllThread:  TDllThread = NIL;
     
    implementation
     
    procedure TDllThread.Execute();
    {-----------------------------------------------------------------------------
      Procedure: Execute
      Date:      13-nov.-2008
      Arguments:
      Result:    None
      Comment:
      Comment
    -----------------------------------------------------------------------------}
    var
      i:                integer;
    begin
      i:=0;
      {TRAITEMENT}
      while (Terminated=False) do
      begin
        Sleep(10);
        Inc(i);
      end;
      {VALEUR DE RETOUR}
      ReturnValue:=1;
    end;
     
    (************************************)
    (*          INITIALIZATION          *)
    (************************************)
    initialization
      {Init thread}
      DllThread:=TDllThread.Create(TRUE);
      DllThread.FreeOnTerminate:=TRUE;
      {Execute thread}
      DllThread.Resume;
     
    (************************************)
    (*         FINALIZATION             *)
    (************************************)
    finalization
      Sleep(10)
    end.
    bon ben je crois qu'on peux pas faire plus simple comme code.
    merci à tous pour votre aide.

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    et bien étant donné que ton Thread fait une boucle infinie jusqu'à ce qu'on dise au Thread de s'arrêter et comme cet arrêt ne vient jamais et bien le Thread continue de tourner jusqu'à plus soif. Du coup lorsque tu viens pour décharger la DLL ton Thread se retrouve "perdu" d'où l'exception.

    C'est l'explication qui me semble la plus plausible.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 37
    Points : 17
    Points
    17
    Par défaut
    oula effectivement, à trop faire des tests dans tous les sens et à essayer de minimiser le code pour isoler le probleme, j'ai fait sauter une ligne de trop dans le finalization:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    (************************************)
    (*         FINALIZATION             *)
    (************************************)
    finalization
      DllThread.Terminate;
      Sleep(10)
    end.
    et du coup ça ne plante plus. Mais du coup faut que je remette les mains dans le camboui pour isoler le bug que j'ai. C'est loupé pour ce coup là.

    Merci de m'avoir ouvert les yeux sur ce petit oubli. Je laisse cette discussion ouverte pour l'instant, le tant que je remette la main sur mon bug.

    Merci d'avoir pris le temps de regarder mon code, à très bientôt.

    Vincent

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 37
    Points : 17
    Points
    17
    Par défaut
    bon en fait sur le finalization on ne peut pas arréter le thread, ça semble trop tard pour le faire. Il faut donc ajouter une petite procédure que le programme appelle avant de décharger la dll du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    procedure StopThread(); export;
    begin
     DllThread.Terminate;
     DllThread.WaitFor;
     DllThread.Free;
    end;
    biensur lors de la création du thread il faut précisé qu'il ne se libère pas tout seul:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DllThread.FreeOnTerminate:=False;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Simple fonction avec résultat (Thread)
    Par z4k4r14 dans le forum Débuter
    Réponses: 1
    Dernier message: 02/04/2012, 11h36
  2. Réponses: 1
    Dernier message: 22/10/2008, 16h14
  3. [JSTL] Tester la valeur d'une variable en mode debug
    Par neowind dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 12/06/2007, 23h25
  4. Erreur de compilation sur une librairie en mode debug
    Par bakaneko dans le forum C++Builder
    Réponses: 2
    Dernier message: 18/05/2006, 16h32
  5. [ Eclipse3.1 ]Lancement d'une application en mode debug
    Par elnivo dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 07/11/2005, 15h52

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