aleksandr-pro,
есть готовая программа написанная на delphi, есть класс
type
TZombie = Class
published
procedure StepForward();
procedure Bite();
procedure Jump();
end;
в эту программу встроен remObjects PascalScript
есть кнопочка "Добавить зомби". при нажатии происходит примерно следующее:
zombie := TZombie.Create()
TZombieThread.Create(zombie)
в Execute функции у TZombieThread происходит примерно следующее:
pascalScriptEngine := TPascalScript.Create()
pascalScriptEngine.addMethod('StepForward', stepForward); // stepForward - метод TZombieThread
pascalScriptEngine.addMethod('Bite', Bite);
pascalScriptEngine.addMethod('Jump', Jump);
pascalScript.runScript(pathToScript);
в итоге из скрипта можно управлять зомби
задача - к программе так же подключить Python.
Для этого использую вот этот компонент
http://code.google.com/p/python4delphi/есть два направления как решить задачу
первый вариант - научится инстанцировать несколько интерпретаторов, так же как было сделано с PascalScript.
проблемы связанные с этим:
+ |
[15:11] <retif_> explain me please why there are restriction while embedding python in C application to instantiate only one interpreter? why i can`t instantiate few interpreters in different threads of one process? [15:12] <bonsaikitten> retif_: global state I'd guess [15:12] <bonsaikitten> retif_: highlander-problem - there can be only one [15:12] <ssbr> retif_: because the python interpreter has globals [15:14] <retif_> ssbr: but this globals will be "global" in own c-thread, isn`t they? [15:14] <Yhg1s> retif_: no. [15:14] <Yhg1s> retif_: they're *C* globals. They're static data. [15:14] <ssbr> retif_: that is not how globals work. :(
|
есть второй вариант, можно интерпретатор просить создать несколько потоков со скриптами
проблемы связанные с этим:
+ |
1. это медленнее т.к. у питона проблемы с GIL 2. у всех скриптов общее пространство имён соотв. import Zombie Zombie.bite() - нельзя повешать на дельфийский TZombieThread.bite
|