2011-03-02 10 views
2

MyHDLパッケージを使用してハードウェアシミュレーションを行っていますが、ユーザーがインタラクティブに信号を変更して他の信号の更新を確認できるようにGUIを配置します。シミュレーション(MyHDL)とwxPythonを一緒に使用する

問題が

  • シミュレータは各ジェネレータはシミュレータを伝えるために、信号の変化、またはコール収率遅延(X)をリッスンすることができるいずれかのいくつかの発生
  • を有しているが、以下のようにMyHDLシミュレータを使用し、ありますx tickの間それをもう一度呼び出すのを待つ。 wxPythonのは明らかにイベントループを使用しています

完了にシミュレーション

  • ランループのループを開始する
  • コールSimulator.run()。したがって、私は明らかに両方を実行することはできません。

    これは働いていたが、インスト()発電機は一度だけ実行しますので、シミュレーションは本当に何もしなかったが、次のように

    私の最初の(ダム)メソッドでした。

    次に、私はこれがマルチスレッドを要求する状況であることを認識しました。私は次のように試しました:

    self._simulator = Simulation(*self._instances) 
        p = Process(target=StartSim, args=(self._simulator,)) 
        p.start() 
        #self._simulator.run() 
        self._app.MainLoop() 
        p.join() 
    
    def StartSim(sim): 
        sim.run() 
    

    もちろん、私はスレッドの安全性について最初は考えていませんでした。また、シミュレータで持っているジェネレータ関数をすべてスレッドに渡すことはできません。

    先ほど作成した堅固なスレッドワーカークラスで実際に作業していて、何らかのメッセージを渡して必要なジェネレータ関数を得ることができると思っています。しかし、wxPythonループの各ステップで "yield delay(1)"と呼ばれる何らかのジェネレータを定義できれば簡単だと思う。クラスのようなもの:

    def OnIdle(self): 
        yield delay(10) 
    

    そして私の元の方法で行っています。問題は、私はこのようなものにするためのコードが必要にされています

    def Hack(): 
         @instance 
         def inst(): 
          self._app.InitMainLoop() 
          while(self._app.InMainLoop()) 
           yield delay(1) 
           self._app.DoMainLoopBody() 
         return inst 
    

    ので、その長いったらしい説明した後、これを行うには良い方法はありますか?私自身のMainLoopを定義したり、何らかの方法でそれを変更することはできますか?または、誰もMyHDLとスレッディングを使って作業していますか?

  • 答えて

    3

    ネヴァーマインドは、私はそれが私が私が私自身のapp.MainLoop周りのループ()とを包むことができ実現()

    app.ExitLoopを使用して「解決」私は、シミュレータは、ハンドラの呼び出し、気というイベントを取得するたびにapp.ExitLoop()、シミュレータに制御を戻し、wxのメインループを再び開始します。

    これは完璧ではありませんが、間違いなくハックですが、動作しています。

    関連する問題