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

Delphi Discussion :

Application <=> DLL (Thread ?)


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 70
    Par défaut Application <=> DLL (Thread ?)
    Bonjour,

    J'ai créé une routine de recherche dans une DLL avec delphi7.
    Elle fonctionne bien mais peut prendre jusqu'à 20 secondes avant de rendre la main au programme (ce qui est normal vu le type de recherche).
    Le programme quant à lui, affiche des objets graphiques qui ont besoin d'un minimum de rafraichissement(l'exe n'est pas forcément en delphi).
    Lorsque j'appelle la routine de recherche une partie de mon affichage est altéré et je dois attendre la fin du processus.

    Y a t-il une solution que je pourrai implémenter au niveau DLL ? Car au niveau programme c'est plus ardu de devoir passer tous les langages en revue.

    En partant d'un exemple simple d'une boucle While() dans une DLL.

    merci pour vos réponses appréciées.

  2. #2
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    deux solutions

    1) la méthode est non bloquante, elle lance un Thread...et il faut alors prévoir une méthode pour informer de la fin du traitement

    2) la méthode invoque une fonction callback lorsqu'elle veux laisser la main à l'exe
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 160
    Par défaut
    je dis peut-etre une betise mais si ta boucle while est rapide, elle monopolyse un max de ressources.

    AMHA ta dll peut déjà être assimilée a bas niveau à un thread séparé.

    Peut etre en mettant un application.ProcessMessages dans la boucle pour redonner du temps a windows?

    Bon je ne suis pas sur dans une dll...

    C'est a tester...

    petit edit pour la forme:

    Dans une application (dans une dll je ne sais pas mais bon c'est un PE comme les autres) la boucle infinie suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    while true do begin end;
    bloque l'ordinateur

    tandis que la boucle infinie suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    while true do begin application.ProcessMessages end;
    rend suffisement la main a windows pour qu'il continue a traiter des messages.

    A faire confirmer ou infirmer par les specialistes du forum.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 70
    Par défaut
    Application.ProcessMessage n'est pas autorisé dans une DLL que je sache.

    Ma DLL utilise une fonction récursive pour la recherche.

    Pour ce qui est du callback, si je l'appelle au sein de la fonction récursive de façon périodique est-ce cela pourrait aider ou bien ce n'est vraiment pas la bonne solution ?

    Mes contraintes sont les langages des programmes exe.
    Delphi, Realbasic,Vb6,VbExpress, etc...

    J'ai l'obligation de faire une DLL pour ainsi dire universelle.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 160
    Par défaut
    Citation Envoyé par Steff2
    Application.ProcessMessage n'est pas autorisé dans une DLL que je sache.

    Ma DLL utilise une fonction récursive pour la recherche.

    Pour ce qui est du callback, si je l'appelle au sein de la fonction récursive de façon périodique est-ce cela pourrait aider ou bien ce n'est vraiment pas la bonne solution ?

    Mes contraintes sont les langages des programmes exe.
    Delphi, Realbasic,Vb6,VbExpress, etc...

    J'ai l'obligation de faire une DLL pour ainsi dire universelle.
    Bahhh pour la dll, si tu mets forms dans les uses tu peux utiliser le Application.ProcessMessage mais j'avoues ne pas l'avoir tester, et il me semble que c'est une solution un peu cracra...

    Qui aura néanmoins l'avantage d'etre facilement implementable pour un prototypage rapide.

    Mais je le repette je ne sais pas ce que va donner le resultat.

    En fait je n'ai jamais éssayé.

  6. #6
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Citation Envoyé par Steff2
    Ma DLL utilise une fonction récursive pour la recherche.
    si tu peux faire en sorte que la fonction puisse être appelée en boucle au lieu de boucler elle même, tu as une solution.

    un peu sur le modèle du FindFirst/FindNext mais avec un InitProc et StepProc

    voici comment serait appelée la DLL depuis Delphi par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     if InitProc then begin
      while StepProc do Application.ProcessMessages;
     end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 70
    Par défaut
    Le résultat avec application.ProcessMessage n'est pas concluant.

    J'ai essayé avec un callback.
    Cela permet à l'exe de reprendre la main.

    Mais voilà, passé une cinquantaine de retour de fonction l'application ne répond plus jusqu'à ce que la DLL ait fini son travail.

    Zut de zut... pas moyen. Je ne vois pas comment améliorer la situation.

  8. #8
    Membre Expert
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    J'opterais pour la version Threadé a ta place.

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

Discussions similaires

  1. convertir application MFC en DLL
    Par AYARA Adel dans le forum MFC
    Réponses: 1
    Dernier message: 20/02/2007, 21h13
  2. Réponses: 1
    Dernier message: 15/01/2007, 10h45
  3. Application MFC et dll indépendante
    Par loup_precaire dans le forum MFC
    Réponses: 1
    Dernier message: 05/06/2006, 16h06
  4. Comment creer une application dans une dll
    Par Aiekick dans le forum MFC
    Réponses: 2
    Dernier message: 05/03/2006, 14h05
  5. Réponses: 18
    Dernier message: 10/12/2005, 01h19

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