我正在使用包MyHDL进行硬件模拟,但我希望在其周围设置一个GUI,以便用户可以交互地更改信号并查看其他信号的更新。
问题是,MyHDL使用仿真器如下所示
generators
wxPython显然使用了一个事件循环。因此,我显然不能在不把另一个绑起来的情况下运行这两个。
我的第一个(哑巴)方法如下
def Hack():
@instance
def inst():
yield delay(1)
self._app.MainLoop()
return inst
MyHack = Hack()
self._instances.append(MyHack)
self._simulator = Simulation(*self._instances)
self._simulator.run()这是可行的,但是inst()生成器只能运行一次,所以仿真实际上什么也没做。
然后我意识到这是一种需要多线程的情况。我尝试了以下几点:
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循环的每一步定义一种叫做“产生延迟(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和线程一起工作过?
发布于 2011-03-02 17:56:56
不过,我用app.ExitLoop()“解决”了它。
我意识到我可以将自己的循环包装在app.MainLoop()周围,每当我得到模拟器关心的事件时,处理程序调用app.ExitLoop(),将控制权交给模拟器,然后再次启动wx的主循环。
这并不完美,这绝对是一次黑客攻击,但它起作用了
https://stackoverflow.com/questions/5164594
复制相似问题