2016-12-04 1 views
0

Я выполняю интерфейс моей простой библиотеки симуляции и визуализации 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 
    } 
} 
+0

Боюсь, что ваш вопрос слишком широк. Не видя кода вашей библиотеки, никто не может сказать вам, как это сделать, чтобы он работал асинхронно, и даже если вы показали код, задача, вероятно, слишком велика для этого формата. – BrenBarn

ответ

0

Там это не способ сделать это внутри одной нити. Вы должны использовать multithreading или multiprocessing для этой цели: один из потоков (thread B) должен принимать команды и запускаться (через выполнение функций вашей dll), а другой поток (thread A - поток с основной логикой) должен отправлять эти запросы и проверять результаты со времени ко времени.

Конечно, ваши dll могут выполнять такую ​​работу самостоятельно, но они не так, как я могу видеть (поскольку ваш вопрос существует).

На самом деле не ожидайте, что в ответ на ваш вопрос кто-то научит вас полностью работать с многопоточным процессом. Эта проблема слишком широка. Существуют книги, статьи и курсы по многопоточности. Вы можете посмотреть на них.

+0

спасибо. Поэтому, возможно, я должен сделать это больше на C++, а не на python. Я не хочу, чтобы «учить полностью работать с многопоточным» ... Я хочу только одну очень простую вещь - я добавил пример того, что хочу в C++ –

Смежные вопросы