Wie kann ich WebKitGTK aus einem gegabelten Thread sicher verwenden?

8

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.

%Vor%

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?

    
Artyom 27.07.2014, 01:37
quelle

1 Antwort

1

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.

    
Quentin Engles 04.08.2014 21:20
quelle
yii\base\ErrorException
Copied! Copy Stacktrace Search Stackoverflow Search Google Error

PHP Core Warningyii\base\ErrorException

PHP Startup: Unable to load dynamic library 'mongodb.so' (tried: /usr/lib64/php/modules/mongodb.so (/usr/lib64/php/modules/mongodb.so: cannot open shared object file: No such file or directory), /usr/lib64/php/modules/mongodb.so.so (/usr/lib64/php/modules/mongodb.so.so: cannot open shared object file: No such file or directory))

$_GET = [
    'id' => '402247',
    'url' => 'how-can-i-safely-use-webkitgtk-from-a-forked-thread',
];

$_SESSION = [
    '__flash' => [],
];