簡體   English   中英

boost :: python-如何從C ++在自己的線程中調用python函數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM