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 :

Chargement d'une DLL et utilisation du multithread


Sujet :

Langage Delphi

  1. #1
    Futur Membre du Club
    Inscrit en
    Février 2003
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 14
    Points : 8
    Points
    8
    Par défaut Chargement d'une DLL et utilisation du multithread
    Bonjour,
    mon programme lance 8 threads tous identiques. Dans mon thread, je charge statiquement des fonctions tous contenues dans la même 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
    implementation
    uses SysUtils, Unit1, Dialogs, StrUtils, Math;
     
    function cRBOpen(cChannel : Byte): Byte; stdcall; external 'rbtdll.dll';
    function cRBClose(cChannel : Byte): Byte; stdcall; external 'rbtdll.dll';
    function cRBSyncEnd(cChannel : Byte): Byte; stdcall; external 'rbtdll.dll';
    function cRBSynchro(cChannel : Byte; cBoot : Byte): Byte;stdcall; external 'rbtdll.dll';
    function cRBSyncResult(cChannel : Byte): Byte; stdcall; external 'rbtdll.dll';
    function cRBManufWrite(cChannel : Byte ; pxZoneManu : PChar): Byte; stdcall; external 'rbtdll.dll';
    function cRBRestart (cChannel : Byte) : Byte ; stdcall ; external 'rbtdll.dll';
    function cRBBootIdent (cChannel, cBootIdent : byte ; bBootIdent  : Pchar) : Byte ; stdcall; external 'rbtdll.dll';
    function cRBDiscXIPDir(cChannel : Byte ; pucNbFile : Pchar ; pxFileList : PChar): Byte; stdcall; external 'rbtdll.dll';
    function cRBComCancel(cChannel : Byte): Byte; stdcall; external 'rbtdll.dll';
    function cRBDownload(cChannel : Byte ; pcFileName : PChar): Byte; stdcall; external 'rbtdll.dll';
    function cRBDwlResult (cChannel : Byte; pcPurcent : Pchar): Byte; stdcall; external 'rbtdll.dll';
    function cRBDiscFormat (cChannel : Byte ; ucDisc : Char): Byte; stdcall; external 'rbtdll.dll';
    function cRBFileDelete (cChannel : Byte ; ulName : longint ; usExt : integer): Byte; stdcall; external 'rbtdll.dll';
    D'après vous, est ce que j'utilise judicieusement l'utilisation de DLL et le multithread ?
    Faut t'il charger dynamiquement une DLL dans ce cas ?

    Si je lance 4 programmes utilisant les memes fonctions de la DLL (sans thread) en visual basic...ca marche mais si je lance 1 programme delphi avec 4 threads le plantage est aléatoires.

    Dans le thread de base, j'associe des composants visuels (avec un synchronize evidement) a la forme principale.

    J'ai modifié les priorité des 8 threads et plus la priorité est faible mieux cela passe...etrange...

  2. #2
    Membre chevronné
    Avatar de Pierre Castelain
    Inscrit en
    Avril 2002
    Messages
    523
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 523
    Points : 1 943
    Points
    1 943
    Par défaut
    Je ne sais pas ce que font ces fonctions, mais si elles ne sont pas "thread safe", tu vas devoir les appeler dans un synchronize ou un queconque autre mécanisme de gestion des appels concurrents (sections critiques, mutex, sémaphores, etc.).

  3. #3
    Futur Membre du Club
    Inscrit en
    Février 2003
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Oula, nom dudiou...ca devient dur alors...

    Merci.

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 685
    Points : 1 608
    Points
    1 608
    Par défaut
    Si toute la DLL n'est pas réentrante, tu peux faire que TOUT appel à une fonction de la DLL passe par une TCriticalSection globale (une des solutions proposées par Pierre). Celle ci empêchera plusieurs thread d'utiliser une même fonction en même temps... mais fait justement perdre tout l'intérêt du multithread.

    Dans ton unité principale, tu peux déclarer ta section critique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    var
      GCriticalSection : TCriticalSection = nil;
     
    initialization
      GCriticalSection := TCriticalSection.Create;
     
    finalization
      GCriticalSection.Free;
    ...et depuis ton thread, tu l'utilises avant d'appeller une fonction de la DLL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
       GCriticalSection.Enter; //Ne rends pas la main tant qu'il y a déjà quelqu'un qui exécute le code
       try
         LByte := cRBRestart($08); //appel de fonction DLL
       finally
          GCriticalSection.Release; //réautorise l'exécution par d'autres.
       end;
    Si seulement quelques fonctions sont problèmatique, tu peux adapter le principe pour uniquement ces fonctions en question.

  5. #5
    Futur Membre du Club
    Inscrit en
    Février 2003
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Merci, je programme ca ce soir et je teste sur la ligne de production demain...

  6. #6
    Futur Membre du Club
    Inscrit en
    Février 2003
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    la DLL est problematiqque car elle gère des timeout !!
    donc en utilisant TCriticalSection je bloque les autres threads donc c'est cuit...

    Je vais perceverer car c'est la dure loi de la nature...A fond, A fond, A fond...

  7. #7
    Futur Membre du Club
    Inscrit en
    Février 2003
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Est ce que charger dynamiquement la DLL, executer la fonction, et decharger la DLL peut etre un solution ?

    (etrange que sous visual basic, en lancant 4 instances du meme programme EXE avec chargement Statique de la DLL...ca marche...)

    Je hais visual basic, on programme comme un barbare et au final ca fonctionne alors que je mets les formes sous Delphi (threads, chargement dynamique...) ca marche plus...

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/12/2010, 21h43
  2. [dll] libérer une dll apres utilisation
    Par polo54 dans le forum API standards et tierces
    Réponses: 12
    Dernier message: 11/07/2009, 23h48
  3. Réponses: 5
    Dernier message: 07/04/2008, 18h40
  4. Réponses: 7
    Dernier message: 13/01/2005, 11h30
  5. [DLL] Utilisation d'une DLL pour utiliser serveur Firebird
    Par sekiryou dans le forum Bases de données
    Réponses: 2
    Dernier message: 11/08/2004, 15h20

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