2013-04-23 2 views
3

Win32 및 Win64에서 GHC 7.4.2 및 GtkH 0.12.4를 사용하면이 프로그램은 더 많은 메모리를 사용하여 컴퓨터에서 약 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 

- 편집 : 나는 2.24.10

될 일이 here 발견은 Gtk의 버전을 사용하고 있습니다 - Edit2가 값 : 노출 이벤트 수정에서 widgetQueueDraw를 요청하는 대신 외부 타이머를 사용하여, 그래서 문제. 당장은 그렇게 하겠지만 왜 그런지는 모르겠다. 필자는 여러 가지 GUI 프레임 워크 (페인트 이벤트에서 GUI 컨트롤을 무효화)를 사용하여이 접근 방식을 여러 언어로 사용했습니다. 일반적으로 무효화를 호출하면 GUI 스레드가 다음 번에 읽히는 플래그가 설정됩니다. 각 프레임의 컨트롤을 다시 그려주는 GUI 스레드에서 끝나지 만 실제로는 여기에서 원하는 것입니다. 그것은 Gtk2Hs에서와 비슷하게 보입니다.

+0

GHC 7.6.2에서는 Fedora x86_64에서 GTKhs 0.12.4 및 GTK + 1.2.10을 사용하여 -O2 또는 명시 적 최적화 플래그를 사용하지 않고이 버그를 재현 할 수 없습니다. 나는 -O2가 약간 높은 메모리 사용 (그러나 성장 없음)과 극단적 인 CPU 사용 없이는 그것을 보았다. –

+0

흥미 롭다 - 나는 GHC와 Gtk의 다른 버전으로 시도 할 것이다. – trethaller

+0

아, GTK-2가 아니라 내 GTK-2 버전을 말했어 야했다. GTK-2는 2.24.16 버전입니다. –

답변

0

프로그램이 순환 루프에 들어간다 생각합니다. 창에 노출 이벤트가 수신되면 (즉, 자체 다시 그리기가 요청 된 경우) 그리기 작업을 수행하지 않습니다. 대신 자신을 다시 그리도록 강요하면 노출 이벤트가 발생합니다. 문제를 두 부분으로 나눠야합니다. 애니메이션의 다음 단계를 준비하는 함수를 호출하는 타이머를 설정하고 widgetQueueDraw을 호출하여 장면을 창에 렌더링해야합니다. 실제 렌더링은 윈도우의 노출 이벤트에 대한 반응으로 이루어져야합니다.

+0

죄송합니다. 시도해 보는 데 시간이 걸렸습니다. 실제로 문제를 해결하지만 그 이유는 모르겠습니다. 나는 원래의 질문을 업데이트 할 것이다. – trethaller