Я выполняю интерфейс моей простой библиотеки симуляции и визуализации C++ для 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
I хотел бы вместо того, чтобы что-то подобное в 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
}
}
Боюсь, что ваш вопрос слишком широк. Не видя кода вашей библиотеки, никто не может сказать вам, как это сделать, чтобы он работал асинхронно, и даже если вы показали код, задача, вероятно, слишком велика для этого формата. – BrenBarn