gpt4 book ai didi

python - 一起使用模拟 (MyHDL) 和 wxPython

转载 作者:太空宇宙 更新时间:2023-11-04 01:40:43 25 4
gpt4 key购买 nike

我正在使用 MyHDL 包进行硬件仿真,但我想围绕它放置一个 GUI,以便用户可以交互地更改信号并查看其他信号更新。

问题是,MyHDL使用模拟器如下

  • 模拟器有几个发电机
  • 每个生成器都可以监听信号变化,或者调用 yield delay(x) 以告诉模拟器等待 x 个滴答再调用它。
  • 调用Simulator.run()开始模拟循环
  • 运行循环直到完成

wxPython 显然使用了事件循环。因此,我显然不能在不绑定(bind)另一个的情况下同时运行这两个。

我的第一个(愚蠢的)方法如下

    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()

当然我一开始并没有考虑线程安全。此外,我在模拟器中拥有的所有这些生成器函数都无法传递给线程。

我想我可以花一些时间真正地研究一个实体线程 worker 类,它较早创建并且可以通过某种消息传递以某种方式获得所需的生成器函数。但是,在我看来,如果我可以定义某种类型的生成器,为 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 和线程吗?

最佳答案

没关系,我使用 app.ExitLoop()“解决”了它

我意识到我可以围绕 app.MainLoop() 包装自己的循环,每当我收到模拟器关心的事件时,处理程序就会调用 app.ExitLoop(),将控制权交还给模拟器,然后它启动主程序再次循环 wx。

它并不完美,它绝对是一个 hack,但它正在工作

关于python - 一起使用模拟 (MyHDL) 和 wxPython,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5164594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com