2016-12-04 3 views
0

私の単純なC++物理シミュレーションとビジュアライゼーションライブラリのインタフェースをPythonに行っています。私はインタラクティブな方法でそれを使用したい - という意味にシミュレーション/視覚化がリターン(python、ctypes)を待たずにダイナミックライブラリからの関数の対話的呼び出し

を実行中にパラメータを解釈するのpythonから関数を呼び出すことにより、パラメータを調整し、現在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 interfaceC++ libraryです。

私は解決策がマルチスレッドと関係があると思いますが、私はその経験がありません。このマルチスレッドがPythonやC++のどちらか、あるいはその両方にあるべきかどうかは私には分かりません。


簡単な例(C++)...唯一の私はglob_varloopながら実行されている変更のpython端子から呼び出さ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)の1つはコマンドを受け入れて(dllの関数を実行することによって)実行し、別のスレッド(メインロジックを持つスレッドthread A - スレッド)はそれらの要求を送信し、時間に。

もちろん、あなたのDLLは自分でこのような作業をするかもしれませんが、あなたの質問が存在するので私は見ることができません。

実際にあなたの質問に答えて、誰かがあなたにマルチスレッド化を完全に働かせるように教えてくれるとは思わないでしょう。この問題は広すぎます。マルチスレッドに関する書籍、記事、コースがあります。あなたはそれらを見るかもしれません。

+0

ですから、おそらく私はPythonではなくC++でもっとやるべきでしょう。私は「マルチスレッドで全面的に働くように教える」ことを望まない...本当にシンプルなことがほしいのですが、私はC++で必要なものの例を追加しました –

関連する問題