Ich versuche in Haskell eine einfache App mit GTK3 und WebKit zu erstellen. Dieser Code erstellt und zeigt ein Fenster mit einem WebView
inside, das bei jedem Tastendruck eine Zufallszahl anzeigt.
Wenn ich es in GHCi (7.8.3) starte, funktioniert es gut. Wenn ich es jedoch erneut ausführe, ohne GHCi zu beenden, zeigt das WebView
niemals etwas an - nur einen weißen Bereich. Das ist ärgerlich, da ich gerne mit Code in GHCi bastle.
Natürlich funktioniert alles gut, wenn ich forkOS
nicht benutze und das Ganze im Hauptthread laufe. Was ist der Grund für diese Einschränkung (ich dachte, dass alle GTK-Funktionen den "Haupt" -Thread als den Thread ansehen, in dem initGUI
aufgerufen wurde), und kann er irgendwie überwunden werden?
Wenn es wie python funktioniert (ich kenne harkell nicht), sollten Sie das gtk main loop
im main thread
behalten.
In Ihrem zweiten Thread rufen Sie g_idle_add mit einem Callback, um Änderungen mit gtk vorzunehmen, und transport data between
your second thread
und gtk
. Sie sollten Ihren Nicht-Haupt-Thread vor gtk main
starten, damit er nicht blockiert wird.
Ich bin mir sicher, dass es in haskell eine Bindung von g_idle_add
gibt. Es gibt auch g_timeout_add, das auch dafür funktioniert.
Das alles hat damit zu tun, dass gtk nicht threadsicher ist.
Tags und Links haskell multithreading gtk webkitgtk