スレッド (STM を使用) と GTK (http://hackage.haskell.org/package/gtk-0.12.3) との組み合わせに少し問題があります。
私は無期限にループし、2秒ごとに刻み、リストの内容を出力してからリストをクリアする関数を持っています。
data VirtualHelicopter = VirtualHelicopter { getOrders :: TVar [(Option, Int)] }
run :: VirtualHelicopter -> IO ()
run h = do
forever ( (putStrLn . show =<< (atomRead orders))
>> clearOrders orders
>> milliSleep 2000)
where
orders = getOrders h
atomRead = atomically . readTVar
clearOrders x = atomically $ writeTVar x []
milliSleep = threadDelay . (*) 1000
さらに、次のように定義された GUI 関数があります。
runGUI :: VirtualHelicopter -> IO ()
runGUI flyer = do
Gtk.initGUI
~ GUI set up stuff, some key listeners that write to the TVar inside flyer ~
forkIO $ run flyer
Gtk.mainGUI
GHCI 内部から「実行」機能を forkIO すると、すべて正常に動作します。2 秒ごとにカチカチ音をたてて、コンソールに出力し、フライヤーの TVar を使用してキューに追加したものをキューに更新します。
ただし、GUI 内から forkIO を実行しようとすると、2 秒ごとにカチカチ音をたてなくなりました。何らかの入力を入力するまでハングアップし、信頼できない出力が得られます。
なぜこれが起こるのか誰にも分かりますか?これが元になったプロジェクト全体をhttps://github.com/tetigi/majomで完全なコンテキストとともに見ることができます。これは、このプロジェクトのアイデアhttp://procrastineering.blogspot.co.uk/2011/11の Haskell 拡張です。/computer-controlling-syma-helicopter.html . スレッド化の実装は、「threadingForVHeli」ブランチにあります。