为什么这个最小的Gtk2Hs程序会泄漏内存

时间:2013-04-23 20:07:04

标签: haskell gtk gtk2hs

在Win32和Win64上使用GHC 7.4.2和GtkHs 0.12.4,这个程序占用的内存越来越多,在我的机器上耗费大约2Mb /秒。 我只是尝试使用Gtk制作动画(这就是为什么我使窗口无效以便立即重绘)。

我尝试使用RTS选项配置内存使用情况,但此内存不可见。

发生了什么事?

import Graphics.UI.Gtk

main :: IO ()
main = do
    initGUI
    window <- windowNew
    onDestroy window mainQuit
    onExpose window (\_ -> widgetQueueDraw window >> return True)
    widgetShowAll window
    mainGUI

- 编辑:我使用的是找到here的Gtk版本,恰好是2.24.10

- Edit2:因此,使用外部计时器而不是从公开事件请求widgetQueueDraw可以解决问题。它现在会做,但我不明白为什么。我已经使用这种方法在几种语言中使用了几个GUI框架(在paint事件中使GUI控件无效)。通常,调用invalidate只会设置一个标志,下次GUI线程启动时会读取该标志。它最终会在每个帧重绘控件的GUI线程中结束,但这实际上就是我想要的。它看起来像是在Gtk2Hs中。

1 个答案:

答案 0 :(得分:0)

我认为你的程序进入循环循环。当窗口收到公开事件(即请求重绘自身)时,您不进行任何绘图。相反,你强制它重绘自己,然后发出一个公开事件,依此类推。您必须将问题分成两部分。您应该设置一个计时器,该计时器调用一个准备动画下一步的函数,并调用widgetQueueDraw将场景渲染到窗口上。实际渲染应该作为对窗口暴露事件的反应。