2013-04-23 75 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

相關問題