gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 17:01:53 25 4
gpt4 key购买 nike

在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/

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