2013-04-23 78 views
3

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

我试图通过RTS选项分析内存使用情况,但是这个内存不可见。

这是怎么回事?

import Graphics.UI.Gtk 

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

- 编辑:我使用GTK的版本发现here这恰好是10年2月24日

- EDIT2:因此,在使用外部定时器而不是从揭露事件的修复要求widgetQueueDraw的问题。它现在会做,但我不明白为什么。我已经用几种语言和几种GUI框架(在绘画事件中使GUI控件失效)使用了这种方法。通常,调用invalidate只需设置一个标志,在下一次GUI线程启动时读取标志。它在GUI线程中每帧重新绘制控件,但实际上这是我想要的。它看起来像一个但在Gtk2Hs。

+0

对于GHC 7.6.2,在Fedora x86_64上使用GTKhs 0.12.4和GTK + 1.2.10,使用-O2或者没有显式优化标志,我不能重现这个bug。我确实看到没有-O2的内存使用率稍高(但没有增长)和CPU使用率极高。 – 2013-04-23 20:18:32

+0

有趣 - 我会尝试不同版本的GHC和Gtk – trethaller 2013-04-23 20:34:00

+0

哦,我应该说我的GTK-2版本,而不是GTK +。 GTK-2版本是2.24.16。 – 2013-04-24 02:32:15

回答

0

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

+0

对不起,我花了一些时间来尝试一下。它确实解决了这个问题,但我不明白为什么。我会更新原来的问题。 – trethaller 2013-05-03 19:32:41

相关问题