Et voilà le troisième jour de mon calendrier de l'avent.

Aujourd'hui, je vais vous parler des threads et des composants. Il m'arrive parfois de vouloir utiliser un composant et de vouloir le faire fonctionner dans un thread.

Le problème, c'est qu'on tombe parfois sur un message :

Exception : Dans un thread lancé par un composant il n'est pas possible d'appeler une procédure locale d'une fenêtre du projet hôte par ExecuteTraitement. Utiliser un procédure globale du projet hôte qui rappelle la procédure locale de la fenêtre.

Et c'est compliqué à corriger vu que l'on n'a pas la main sur le code du composant. Mais j'ai trouvé une solution qui pourra peut-être vous arranger, c'est de faire tourner ce bout de code dans le thread principal avec la fonction ThreadExecutePrincipal.

Et j'ai créé deux fonctions qui permettent de le faire tout simplement avec une closure :

PROCEDURE CréerProcédureThreadSafeSansResultat(LOCAL p est une Procédure)
ProcédureThreadSafe est une Procédure = iProcedureThreadSafe

RENVOYER ProcédureThreadSafe

    PROCEDURE INTERNE iProcedureThreadSafe(*)
        ExécuteThreadPrincipal(p, MesParamètres)
    FIN

Et la seconde :

PROCEDURE CréerProcédureThreadSafeAvecResultat(LOCAL p est une Procédure)
ProcédureThreadSafe est une Procédure = iProcedureThreadSafe

RENVOYER ProcédureThreadSafe

    PROCEDURE INTERNE iProcedureThreadSafe(*)
        Renvoyer ExécuteThreadPrincipal(p, MesParamètres)
    FIN

Ces fonctions utilisent le pattern decorator et permettent de transformer une procédure quelconque en une procédure qui ne s'exécute que dans le thread principal.

Voilà, j'espère que cette petite astuce vous permettra d'utiliser plus simplement les composants.

Bonne journée à tous !

Jonathan Laurent

Read more posts about this author.

Comments