![](/img/trans.png)
[英](in Boost::Python)How can I instantiate an object of a class defined in a python module and invoke its methods from C++
[英]boost::python - how to invoke a python function in its own thread from C++?
我有一个用python编写的模块。 这个模块是我在Python中实现的许多不同功能的接口:
EmbeddingInterface.py只需导入此模块并创建一个实例:
import CPPController
cppControllerInstance = CPPController()
我想在c ++中使用cppControllerInstance。 到目前为止,这是我所做的:
#include <Python.h>
#include <boost\python.hpp>
using namespace boost;
python::object createController()
{
try
{
Py_Initialize();
python::object mainModule = python::import("__main__");
python::object mainNamespace = mainModule.attr("__dict__");
python::dict locals;
python::exec(
"print \"loading python implementetion:\"\n"
"import sys\n"
"sys.path.insert(0, \"C:\\Projects\\Python\\ProjectName\\Panda\")\n"
"import EmbeddingInterface\n"
"controller = EmbeddingInterface.cppControllerInstance\n",
mainNamespace, locals);
python::object controller = locals["controller"];
return controller;
}
catch(...) {}
}
问题:
该“控制器”具有一些必须异步调用的功能。 它的工作是连续的,此外还可能引发异常。 这就是为什么std :: async听起来很棒的原因。
但这不起作用:
int main()
{
python::object controller = createController();
python::object loadScene = controller.attr("loadScene");
//loadScene(); // works OK but blocking!
std::async(loadScene); // non blocking but nothing happens!
while(true); // do some stuff
}
我试图用自己的线程调用python函数'loadScene',但该函数似乎正在阻塞。 它永远不会回来。
这样做的正确方法是什么?
似乎您误解了std :: async的行为
测试代码片段:
#include <iostream>
#include <chrono>
#include <thread>
#include <future>
int doSomething(){
std::cout << "do something"<<std::endl;
return 1;
}
int main(){
auto f = std::async(doSomething);
std::this_thread::sleep_for(std::chrono::seconds(3));
std::cout <<"wait a while"<<std::endl;
f.get();
return 0;
}
输出:
wait a while
do something
换线
auto f = std::async(doSomething);
至
auto f = std::async(std::launch::async,doSomething);
然后输出:
do something
wait a while
例如,要在另一个线程中立即运行它,可以尝试:
std::async(std::launch::async,loadScene);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.