0

スレッド (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」ブランチにあります。

4

1 に答える 1

1

hammarが言ったように、ビルドオプションに -threaded を追加すると解決しました。スレッド化されたもののためのコンパイラオプションがあることに気づきませんでした!

また、言及された競合状態の解消にも取り組みます:)

于 2012-11-20T13:44:51.827 に答える