我一直在从事我的暑期研究项目,并且一直在使用 Diagrams 库来绘制带有边、节点的图形。我正在模拟整个图表中的信息传播,因此我的图表不断更新。我拥有用于更新图形状态数据结构、绘制图表等的所有基础设施。
出于测试目的,我一直在使用带有反馈循环的 SVG 后端getLine
,更新图表,然后将其渲染到相同的“.svg”文件中。这显然是相当劣质的,并且依赖于我的 .svg 查看器在文件更新时更新的事实。
我已经研究过为此使用 GTK 后端,因此我可以将图表渲染到drawingArea
GTK 窗口中。我已经安装了所有这些,并且一直在搞乱一些小程序。
但是,我无法理解如何实现我的程序。我已经看过很多关于如何在 GTK 窗口中绘制图表的示例,但是它们似乎都没有包括基于按钮按下甚至命令行中的某些内容来更新该图像。
我听说过一些关于 GTK 的多线程。我正在考虑编写一个函数,例如:
renderDiagram :: DrawingArea -> Diagram B -> IO ()
renderDiagram c d = do
c `on` exposeEvent $ do
liftIO (defaultRender c d)
return True
widgetQueueDraw c
更改画布暴露时呈现的图表,然后强制暴露事件。如果我然后运行更新图形的主程序执行,并renderDiagram
在单独的线程上运行mainGUI
,我会得到我想要的结果吗?有没有更清洁的方法来做到这一点?
如果有人能指出我正确的方向,或者提供一些外部阅读,那就太好了。谢谢。