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 :

Probleme temps d'execution prg dans IDE Delphi11.2 et en ligne de commande d'une fonction de DLL


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2005
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 25
    Par défaut Probleme temps d'execution prg dans IDE Delphi11.2 et en ligne de commande d'une fonction de DLL
    Bonjour,

    dans un projet multiplateforme domotique(W11/Android12/Debian12), j'ai un probleme nouveau pour moi, lorsque j'execute ce programme sous Delphi11.2/FMX/Win64
    qui appelle une fonction "vosk_model_new" d'une librairie "libvosk.dll"(librairie de reconnaissance vocale) :
    Unit d'entete de la Dll "Vosk_api.pas":
    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
     
    unit vosk_api;
    { This unit is automatically generated by Chet:
      https://github.com/neslib/Chet }
    {$MINENUMSIZE 4}
    interface
    const
      {$IF Defined(WIN32)}
      LIB_VOSK = 'libvosk.dll';
      _PU = '';
      {$ELSEIF Defined(WIN64)}
      LIB_VOSK = 'libvosk.dll';
      _PU = '';
      {$ELSE}
        {$MESSAGE Error 'Unsupported platform'}
      {$IFEND}
     
    type
      PVoskModel = Pointer;
      PPVoskModel = ^PVoskModel;
      PVoskSpkModel = Pointer;
      PPVoskSpkModel = ^PVoskSpkModel;
      PVoskRecognizer = Pointer;
      PPVoskRecognizer = ^PVoskRecognizer;
      PVoskBatchModel = Pointer;
      PPVoskBatchModel = ^PVoskBatchModel;
      PVoskBatchRecognizer = Pointer;
      PPVoskBatchRecognizer = ^PVoskBatchRecognizer;
     
     
    function vosk_model_new(const model_path: PAnsiChar): PVoskModel; cdecl;
      external LIB_VOSK name _PU + 'vosk_model_new';
    ...
    Unit d'appel des fonctions 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
    unit VoskModelNew;
    interface
    uses
      SysUtils, Classes,
      vosk_api;
    type
      TVoskModel = class(TComponent)
      private
        { Private declarations }
        FModel: PVoskModel;
        FModelPath: String;
      protected
        { Protected declarations }
      public
        { Public declarations }
        //constructor Create(AOwner: TComponent); overload; override;
        constructor Create(AOwner: TComponent; AModelPath: String); reintroduce;
        destructor Destroy; override;
        function FindWord(AWord: String): Integer;
        property Model: PVoskModel read FModel;
      published
        { Published declarations }
        property ModelPath: String read FModelPath;
      end;
     
    implementation
     
    constructor TVoskModel.Create(AOwner: TComponent; AModelPath: String);
    var pmodelpath:pAnsichar;
    begin
      inherited Create(AOwner);
      FModelPath := AModelPath;
      pmodelpath := AnsiStrAlloc(length(Amodelpath));
      StrPLCopy(pmodelpath, Amodelpath, length(Amodelpath));
        try
        FModel := vosk_model_new(pmodelpath);//FModelPath));
        finally
          StrDispose(pmodelpath);
        end;
    end;
    ...
    1) Sous W11/Delphi11.2FMX/Win64:lorsque le prg est executé dans l'IDE mode debug ou release, le temps d'éxecution de la fonction est d'environ 2,5 minutes!!
    2) Sous W11/Delphi11.2FMX/Win64:lorsque le prg est executé en ligne de commande dans une fenêtre windows, le temps d'execution de la fonction est OK(environ 1 à 2 secondes).
    3) Sous Delphi11.2FMX/Android12, le temps d'execution hors IDE de la fonction est OK(environ 1 à 2 secondes). (impossible de tester dans EDI en mode DEBUG pour Android)
    - sous RASPI/Debian12/Lazarus4.0, pas de problème non plus avec la libvosk.so equivalente.

    C'est forcemment bien bloquant pour développer sous Delphi.

    je joins les logevents de l'EDI, qui liste les multiples debut/Sortie de thread (>100) pendant l'éxecution de la fonction sous EDI.
    Extrait LOGS:
    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
    ....
    Sortie de débogage: 13/06/2025 17:49:51:DEBUT voskmodel_create Processus ptestvosk1.exe (16656)
    Début du Thread : ID du thread : 18932. Processus ptestvosk1.exe (11040)
    Début du Thread : ID du thread : 12652. Processus ptestvosk1.exe (11040)
    Début du Thread : ID du thread : 4672. Processus ptestvosk1.exe (11040)
    Début du Thread : ID du thread : 10492. Processus ptestvosk1.exe (11040)
    Début du Thread : ID du thread : 19368. Processus ptestvosk1.exe (11040)
    Début du Thread : ID du thread : 18140. Processus ptestvosk1.exe (11040)
    Début du Thread : ID du thread : 4368. Processus ptestvosk1.exe (11040)
    Début du Thread : ID du thread : 9756. Processus ptestvosk1.exe (11040)
    Début du Thread : ID du thread : 15528. Processus ptestvosk1.exe (11040)
    Début du Thread : ID du thread : 8128. Processus ptestvosk1.exe (11040)
    Début du Thread : ID du thread : 6320. Processus ptestvosk1.exe (11040)
    Sortie du Thread : ID du thread : 18932. Processus ptestvosk1.exe (11040)
    ....
    Sortie de débogage: 13/06/2025 17:51:50:FIN voskmodel_create Processus ptestvosk1.exe (16656)
    Après de nombreux tests:
    -Appel fonction en Stdcall ou cdecl
    -Avec lib en statique ou dynamique
    -Options/projet/debogage distant décoché
    le probleme est identique et je ne vois aucune solution.

    Est-ce plutot côté de l'EDI qu'il faut chercher ou coté de la dll Vosk?

    Quelqu'un aurait'il une piste, idealement une solution ?

    Merci d'avance et bonne journée.
    Fichiers attachés Fichiers attachés

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