- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用 pybind11 公开 this game code (用 C++ 编写)到 Python。
我尝试做的第一件事是,通过在 C++ 部分公开一个启动函数来启动游戏。到目前为止看起来像这样(c++):
#define NOMINMAX
#include "GameWinMain.h"
#include "GameEngine.h"
#include <iostream>
#include "Contra.h"
#include <pybind11/pybind11.h>
namespace py = pybind11;
using namespace std;
#define GAME_ENGINE (GameEngine::GetSingleton())
int start()
{
// Enable run-time memory leak check for debug builds.
#if defined(DEBUG) | defined(_DEBUG)
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
#endif
WinMain(GetModuleHandle(0), 0, 0, SW_SHOW);
return 0;
}
int _tmain()
{
start();
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
if (GAME_ENGINE == NULL) return FALSE; // create the game engine and exit if it fails
GAME_ENGINE->SetGame(new Contra()); // any class that implements AbstractGame
cout << "jogo foi iniciado?";
return GAME_ENGINE->Run(hInstance, iCmdShow); // run the game engine and return the result
}
PYBIND11_MODULE(contra, m)
{
cout << "modulo importado! ";
m.doc() = "contra game";
m.def("start", &start, "starts the contra game");
}
在 python 端看起来像这样:
from threading import Thread
from Contra_remake import contra
Thread(target=contra.start, args=()).start()
print('print!')
问题是,打印行只在游戏关闭时执行,即使在另一个线程中开始游戏也是如此。
最佳答案
那是因为 Python 的 GIL(全局解释器锁)。您可以阅读更多相关信息 here .
如果您想解决这个问题,您应该在您的 C++ 代码中手动释放 GIL,如 this link 中所述。 .
简而言之,您可以像下面这样更改您的启动方法,以避免您的 Python 线程被阻塞:
#include <python.h>
class GilManager
{
public:
GilManager()
{
mThreadState = PyEval_SaveThread();
}
~GilManager()
{
if (mThreadState)
PyEval_RestoreThread(mThreadState);
}
GilManager(const GilManager&) = delete;
GilManager& operator=(const GilManager&) = delete;
private:
PyThreadState* mThreadState;
};
int start()
{
GilManager g;
// Enable run-time memory leak check for debug builds.
#if defined(DEBUG) | defined(_DEBUG)
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
#endif
WinMain(GetModuleHandle(0), 0, 0, SW_SHOW);
return 0;
}
关于python - Pybind11 函数调用阻塞主线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57383574/
首先,感谢大家努力解决我的这个疑问。我正在转换一个最小的 C++ 项目以在 Python 中使用。这种努力背后的真正原因是为了速度。 我遇到了 PyBind,对它的功能以及他们提供的文档数量感到非常惊
我有以下类结构(我实际实现的简化示例): /* TestClass.hpp */ #pragma once template class CurRecTemplate { protected:
我有以下设置(1 个基类、1 个派生类、1 个容器)。容器采用 shared_ptr作为输入。 #include namespace py = pybind11; struct Base { };
我刚刚安装了 pybinding,我正在尝试运行该库文档中提出的第一个示例。 import pybinding as pb import numpy as np import matplotlib.p
我正在使用 pybind 包装一些 C++ 函数,然后在 Python 中使用它。我需要一些结构,但我不知道如何在 Python 中访问它的属性。我的结构没有只有方法的属性,所以我认为绑定(bind)
我使用以下命令创建了一个 miniconda 环境: conda create -n build_a_python_cpp_module xtensor-python -c conda-forge 激
为了更好地理解如何使用 pybind 库将参数从 Python 传递到 C++ 函数,我想构建一个小的虚拟/演示代码,我可以在其中接收 C++ 端的 Python 列表,将其转换为浮点指针对象,然后打
我正在尝试编译 Pybind11 C++ 中的模块它调用了几个头文件(.h)在上面。由于我有很多头文件,我决定做一个 Makefile ,没有问题,除了创建目标共享对象文件(s.o) .我需要这个共享
pybind 的新手 - 阅读文档,但我不了解如何将其应用于二维数组。 我有两个数组存储 3d 坐标 shape = (10,3) a = np.zeros(shape=(10,3)) b = np.
TL;博士 将 pybind11 绑定(bind)添加到工作中的 C++ DLL 项目允许我在 Python 中导入和使用生成的 DLL,但会破坏我使用 boost/dll 机制在 C++ 代码中使用
在 Pybind 中,可以通知 Python 关于函数的参数名称: m.def("add", &add, "A function which adds two numbers", py::arg(
当我运行 pip install .在我有 setup.py 的目录中。我正在使用 pybind11 为我的 C++ 项目构建一个 python 模块。 (同样,在 Windows 10 上) 我收到
我正在尝试使用 PyBind 在 C++ 中嵌入一些 Python 代码。大多数文档都是关于使用 C++ 扩展 Python,但我对嵌入感兴趣: 关于 http://pybind11.readthed
我正在尝试使用 pybind11 实现 C++ 到 python,并使用 pybind11-multiprocessing-hangs 。不同之处在于我想在c++中使用python对象并继续从c++调
我是一名优秀的程序员,十分优秀!