2016-12-04 1 views
0

파이썬에 간단한 C++ 실제 시뮬레이션 및 시각화 라이브러리 인터페이스를 사용하고 있습니다. 나는 상호 작용하는 방식을 사용하고 싶습니다 - 에 의미를 파이썬에서 함수 매개 변수를 해석을 호출하여 매개 변수를 조정 시뮬레이션/시각화을 실행하는 동안)반환을 기다리지 않고 동적 라이브러리의 대화식 호출 (파이썬, 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 파이썬 대신 이런 식으로 뭔가를하고 싶은 해석 : 여기

>> 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 interfaceC++ library입니다.

솔루션은 멀티 스레딩과 관련이 있다고 생각하지만, 그 경험은 없습니다. 이 멀티 스레딩이 파이썬이나 C++ 또는 둘 모두의 측면에 있어야하는지는 확실하지 않습니다.


간단한 예 (C++) ... 단지 내가 glob_varloop 동안 실행 수정 파이썬 터미널에서 호출 setGlobVar()입니다 원하고 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++에서 더 많이해야 할 것입니다. 나는 "멀티 스레딩으로 모든 일을 완벽하게 가르치기"를 원하지 않는다 ... 나는 정말 단순한 것을 하나만 원한다 - 나는 C++에서 원하는 것을 예제로 추가했다. –

관련 문제