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

标签 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

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

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

最佳答案

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

关于haskell - 为什么这个最小的 Gtk2Hs 程序会泄漏内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16178219/

相关文章:

gtk - 如何扩展 Gtk 标签以填充整个水平空间?

haskell - 如何在 gtk2hs 中的事件处理程序之间传递状态

haskell - Gtk 终端小部件

Haskell:字符 'i' 处的字符串/字 rune 字中的词法错误

Haskell - 用于稀疏矩阵乘法的数据结构是什么?

function - 这个函数是如何工作的 : const const (negate 1) (negate 2) 3

gtksourceview 中的代码折叠

c - GTK 扩展器一次一个

haskell - gtksourceview2 : implement completion provider

scala - 在 FRP 中实现快照