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

Lazarus Pascal Discussion :

Python4Lazarus : utiliser plusieurs fils d'exécution


Sujet :

Lazarus Pascal

  1. #1
    Candidat au Club
    Python4Lazarus : utiliser plusieurs fils d'exécution
    Bonjour,

    J'essaye d'utiliser python4lazarus, démarrer chaque PythonEngine dans un Thread et exécutze dans chacun un script Python différent.
    Puis-je avoir un exemple si c'est possible ?

    Merci

  2. #2
    Expert confirmé
    hello,

    peux-tu nous dire ce que tu veux faire exactement ? Lancer plusieurs scripts python en parallèle ? Autre chose ? As-tu déjà essayé quelque chose ? Montre-nous alors ton code.

    As-tu ce problème ?


    Is it possible to run more than one PythonEngine from threads inside an app?
    When I try that, it says "There is already one instance of TPythonEngine running". Maybe there is a workaround?
    La personne qui maintient Python4Lazarus (Alextp) est souvent présent dans le forum anglais de Lazarus alors pose ta question dans ce forum ou relance la question ci-dessus dans ce forum.

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  3. #3
    Candidat au Club
    Bonjour,
    Je cherche à démarrer plusieurs scripts Python (qui bouclent à l'infini, où je devrais récupérer le résultat d'un traitement) et chacune dans un thread. J'ai déjà essayé avec une classe TThread et ça ne marche pas. J'ai même testé avec le initThread:=True du PythonEngine mais l'application reste quand même bloquée.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Procedure TMyThread.Execute; 
    begin
      GetPythonEngine.ExecString(memo1.Text);
    end;


    Code Python :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    While True:          
       print(generate())

  4. #4
    Expert confirmé
    hello,
    cela n'a pas l'air facile de gérer les threads avec Python4Lazarus. Il y a bien la classe TPythonThread mais il n'y a pas d'exemple qui fonctionne dans les démos. Il y a bien la démo 11 dans la partie démo Delphi mais elle est compliquée et difficile à traduire en Lazarus. Et Il y a même je pense des erreurs de code dans la définition de TPythonThread dans PythonEngine.pas ( exemple : la propriété ThreadExecMode n'a pas de définition write).
    Sinon il y a des explications pour l'utilisation de Thread dans Python4Delphi ici

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  5. #5
    Membre expert
    Salut,

    un petit zip attaché ici avec ton application de test, nous permettrait de t'aider plus efficacement. Sinon il y a une autre solution lancer les scripts via la commande python avec un TProcess et récupérer le résultat.
    Tu peux te référer à cette discussion pour plus d'infos.

    A+
    Jérôme
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  6. #6
    Expert confirmé
    hello,
    bon ben finalement j'ai réussi à utiliser TPythonThread.
    1 - Il y a une erreur dans le fichier PythonEngine.pas du paquet Python4Lazarus :
    il manque le write pour la propriété ThreadExecMode de la classe TPythonThread
    près de la ligne 3127 remplacer :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
       property ThreadExecMode: TThreadExecMode read fThreadExecMode;
    par
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
        property ThreadExecMode: TThreadExecMode read fThreadExecMode
    	                                         write fThreadExecMode;
    2 - J'ai créé un petit projet (en pièce jointe) qui permet de lancer ce script Python dans 3 threads en même temps :
    Code Python :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # coding: utf8
    # script for testing PythonThread 
    # Jurassic Pork october 2020
    import time
    print('Coundown Thread1 :')
    time.sleep(1.0)
    i = 1
    while i < 5:
         print('Thread1 : ',5 - i)
         i += 1
         time.sleep(1.0)
    print('Thread1 terminated')

    Voici ce que cela donne après exécution :


    Les print du python sont envoyés dans la console.
    Le projet a été testé avec Lazarus 2.0.10 sous windows 10 et Lazarus 2.0.8 sous Centos 8.1.
    En pièce jointe ma configuration du composant PythonEngine1 pour windows. Pour centos 8 :
    DllName : libpython3.6m.so
    DllPath : /usr/lib64
    RegVersion : 3.6


    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  7. #7
    Candidat au Club
    Merci

  8. #8
    Expert éminent sénior

    Citation Envoyé par jurassic pork Voir le message
    bon ben finalement j'ai réussi à utiliser TPythonThread.
    Respect !
    Y a quand même des bons, sur ce forum, bravo à toi, JP.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

###raw>template_hook.ano_emploi###