动态库中函数的交互调用,无需等待返回(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_varloop正在运行,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 
    } 
} 
+0

恐怕你的问题太宽泛了。没有看到你的库的代码,没有人可以告诉你如何使它像这样异步工作,即使你显示了代码,这个任务对于这种格式来说可能太大了。 – BrenBarn

有修改的状态是没有办法做到单线程内。为此,您必须使用multithreadingmultiprocessing:其中一个线程(thread B)应该接受命令并运行(通过运行dll的函数),而另一个线程(thread A - 带有主逻辑的线程)应该发送这些请求并从时间检查结果时间。

当然你的dll可以自己做这样的工作,但他们并不像我所见(因为你的问题存在)。

其实不要指望在回答你的问题时,有人会教你完全使用多线程。这个问题太广泛了。有关于多线程的书籍,文章和课程。你可以看看他们。

+0

谢谢。所以也许我应该在C++而不是Python中做更多的事情。我不想“用多线程完全教学”......我只想要一件非常简单的事情 - 我在C++中添加了我想要的东西的示例 –