动态库中函数的交互调用,无需等待返回(Python,ctypes)
我正在做我的简单C++物理仿真和可视化库到Python的接口。我想在互动的方式来使用它 - 意为通过调用Python函数解释参数调整参数,而模拟/可视化运行)动态库中函数的交互调用,无需等待返回(Python,ctypes)
目前non-interactive scrip看起来是这样的:
import numpy as np
import pyVis3D as vis
# inititalization
vis.lib.initWindow()
# modify visualization state - must do before call vis.lib.loop()
ts = np.linspace(0,2*np.pi,100)
poss = np.transpose(np.stack([ np.sin(ts), np.cos(ts), np.sin(ts*3) ]), (1,0)).copy()
vis.polyline(poss)
# loop of visualization window update
vis.lib.loop(1000000) # I have to wait for return, cannot change anything interactively
我想而不是像这样在Python解释:
>> import numpy as np
>> import pyVis3D as vis
>> vis.lib.initWindow() # inititalization
>> vis.lib.loop(1000000) # run loop
# modify state of vis.lib while vis.lib.loop() is running
>> ts = np.linspace(0,2*np.pi,100)
>> poss = np.transpose(np.stack([ np.sin(ts), np.cos(ts), np.sin(ts*3) ]), (1,0)).copy()
>> vis.polyline(poss) # I should see new curve in that window
这里是ctypes interface,这里的C++ library。
我想解决方案与多线程有关,但我没有经验。我甚至不确定这个多线程应该在python还是C++或者两者兼而有之。
简单的例子(C++)......只想到我要的是setGlobVar()
蟒蛇终端叫做修改glob_var
而loop
正在运行,loop
输出反映glob_var
double glob_var=0;
extern{
// this function should run on background, write out state each 10 ms
void loop(int n){
for(int i=0;i<n;i++){
SDL_delay(10); // wait 10 ms
printf("%f \n", glob_var); // each iteration write current state of glob_var
}
}
// this function should be called from python terminal
void setGlobVar(double f){
glob_var = f; // change state of glob_var
}
}
有修改的状态是没有办法做到单线程内。为此,您必须使用multithreading
或multiprocessing
:其中一个线程(thread B
)应该接受命令并运行(通过运行dll的函数),而另一个线程(thread A
- 带有主逻辑的线程)应该发送这些请求并从时间检查结果时间。
当然你的dll可以自己做这样的工作,但他们并不像我所见(因为你的问题存在)。
其实不要指望在回答你的问题时,有人会教你完全使用多线程。这个问题太广泛了。有关于多线程的书籍,文章和课程。你可以看看他们。
谢谢。所以也许我应该在C++而不是Python中做更多的事情。我不想“用多线程完全教学”......我只想要一件非常简单的事情 - 我在C++中添加了我想要的东西的示例 –
恐怕你的问题太宽泛了。没有看到你的库的代码,没有人可以告诉你如何使它像这样异步工作,即使你显示了代码,这个任务对于这种格式来说可能太大了。 – BrenBarn