
On Mon, 13 Jun 2011 16:59:11 -0400
David McBride
The IO Channel antoine recommended is a very elegant solution to this.
main = do let cmd = ..., parms =... (_ ,Just hout ,Just herr ,p) <- createProcess (proc cmd parms) chan <- newTChanIO :: IO (TChan String) makeThread hout chan makeThread herr chan forever $ atomically $ readTchan chan >>= print
makeThread handle chan = forkIO $ forever $ do hGetLine handle >>= atomically (writeTchan chan)
Thanks for the code. I added import GHC.Conc.Sync import System.IO import System.Environment import System.Process import Control.Monad import Control.Concurrent.STM.TChan but when compiling I get: cmdtest2.hs:17:45: Couldn't match expected type `STM a0' with actual type `IO ()' Expected type: String -> STM a0 Actual type: String -> IO () In the second argument of `(>>=)', namely `print' In the second argument of `($)', namely `readTChan chan >>= print' cmdtest2.hs:20:23: Couldn't match expected type `String -> IO a0' with actual type `IO a1' In the return type of a call of `atomically' In the second argument of `(>>=)', namely `atomically (writeTChan chan)' In the expression: hGetLine handle >>= atomically (writeTChan chan) I'm still too much in the dark regarding the monad stuff thus having no idea how to fix it. -- Manfred