Haskell与gi cairo和gi gtk挂起

Haskell与gi cairo和gi gtk挂起,haskell,gtk,gtk3,cairo,Haskell,Gtk,Gtk3,Cairo,在我的一个项目中,当我在一个特殊的滚动视口中滚动时,我注意到程序不时挂起。我把这个问题浓缩成一个极小的程序 当您在可滚动区域快速上下滚动时,它会挂起,但不会抛出任何错误消息 通过尝试,我发现 onWidgetDraw drawingArea $ \(Context fp) -> withManagedPtr fp $ \p -> (`runReaderT` Cairo (castPtr p)) $ runRender $ do return True 他负责吊死。没有这两条线

在我的一个项目中,当我在一个特殊的滚动视口中滚动时,我注意到程序不时挂起。我把这个问题浓缩成一个极小的程序

当您在可滚动区域快速上下滚动时,它会挂起,但不会抛出任何错误消息

通过尝试,我发现

onWidgetDraw drawingArea $ \(Context fp) -> withManagedPtr fp $ \p -> (`runReaderT` Cairo (castPtr p)) $ runRender $ do
   return True
他负责吊死。没有这两条线,它就可以正常工作。不过我需要它们(在我的项目中,它不止两行,但它已经挂起了两行)

我不知道发生了什么事。有人知道怎么解决这个问题吗

代码(上的所有文件):

{-#语言重载字符串}
{-#语言重载标签}
模块通知中心在哪里
导入数据,也许吧
导入符合条件的数据。文本作为文本
导入控制.Monad.Trans.Reader(ReaderT(..)
将GI.Gtk作为Gtk导入
导入Graphics.Rendering.Cairo
导入Graphics.Rendering.Cairo.Types(Cairo(..)
导入Graphics.Rendering.Cairo.Internal(渲染(..)
开罗进口
进口国外货物。Ptr(castPtr)
main::IO()
main=do
Gtk.init Nothing
让objsToGet=[“主窗口”,“主窗口”]

生成器这是haskell gi的问题,由维护人员修复。

haskell-gi-base-0.20.5是否仍会崩溃?它在几天前发布,并修复了一些问题。你可能还想问我没有尝试过,但是我在github上创建了一个问题,这个问题得到了解决,所以我认为它现在可以工作了。
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE OverloadedLabels #-}

module NotificationCenter where

import Data.Maybe
import qualified Data.Text as Text
import Control.Monad.Trans.Reader (ReaderT(..))
import GI.Gtk as Gtk
import Graphics.Rendering.Cairo
import Graphics.Rendering.Cairo.Types (Cairo(..))
import Graphics.Rendering.Cairo.Internal (Render(..))
import GI.Cairo
import Foreign.Ptr (castPtr)

main :: IO ()
main = do
  Gtk.init Nothing
  let objsToGet = [ "main_window" , "main_bg" ]
  builder <- Gtk.builderNew
  Gtk.builderAddFromFile builder "crash.glade"

  (Just win) <- Gtk.builderGetObject builder "main_window"
  (Just bg) <- Gtk.builderGetObject builder "main_bg"

  mainWindow <- (Gtk.unsafeCastTo Gtk.Window) $ win
  drawingArea <- (Gtk.unsafeCastTo Gtk.DrawingArea) $ bg

  onWidgetDraw drawingArea $ \(Context fp) -> withManagedPtr fp $ \p -> (`runReaderT` Cairo (castPtr p)) $ runRender $ do
    return True

  onWidgetDestroy mainWindow mainQuit
  widgetShowAll mainWindow
  Gtk.main