gpt4 book ai didi

multithreading - 如何从 fork 线程安全地使用 WebKitGTK?

转载 作者:行者123 更新时间:2023-12-04 08:25:23 29 4
gpt4 key购买 nike

我正在尝试使用 GTK3 和 WebKit 在 Haskell 中制作一个简单的应用程序。此代码创建并显示一个包含 WebView 的窗口。里面,每次按下一个键时都会显示一个随机数。

import           Control.Monad.Trans (lift)
import Control.Concurrent (forkOS)
import System.Random (randomIO)
import Graphics.UI.Gtk -- gtk3
import Graphics.UI.Gtk.WebKit.WebView -- webkitgtk3


main = forkOS $ do

-- Init GTK.
initGUI

-- Create a window which would finish the GTK loop
-- after being closed.
window <- windowNew
window `after` objectDestroy $
mainQuit

-- Create a WebView inside.
webView <- webViewNew
set window [containerChild := webView]

-- Make the WebView display a random number on key press.
webView `on` keyReleaseEvent $ lift $ do
x <- randomIO :: IO Int
webViewLoadString webView (show x) Nothing Nothing ""
return True

-- Run GTK.
widgetShowAll window
mainGUI

当我在 GHCi (7.8.3) 中运行它时,它运行良好。但是,当我在不退出 GHCi 的情况下再次运行它时, WebView从不显示任何东西——只是纯白色区域。这令人不安,因为我喜欢在 GHCi 中修改代码。

当然,如果我不使用 forkOS,一切正常。并在主线程中运行整个事情。这种限制的原因是什么(我认为所有 GTK 函数都认为“主”线程是调用 initGUI 的线程),并且可以以某种方式克服它吗?

最佳答案

如果它像python(我不知道haskell)一样工作,你应该保留gtk main loopmain thread .

在你的第二个线程调用 g_idle_add带有回调以使用 gtk 和 transport data between 进行更改您的 second thread , 和 gtk .你应该在 gtk main 之前启动你的非主线程。所以它没有被阻止。

我确定有 g_idle_add 的绑定(bind)在 haskell 。还有 g_timeout_add 也适用于此。

这一切都与 gtk 不是线程安全的有关。

关于multithreading - 如何从 fork 线程安全地使用 WebKitGTK?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24977136/

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