
Hello, I am playing around with concurrency using ghc 5.02.2. What I'd like to do is have a bunch of threads do something indefinitely, while one thread monitors stdin for user input (the user input affects the behavior of the other threads in some way). From the documentation I had assumed that standard Haskell I/O functions (like getline) would not block other running threads, but this doesn't seem to be the case as illustrated here: conTry3 = forkIO (loop 'a') >> quitYet where loop ch = hPutChar stdout ch >> loop ch quitYet = do x <- getLine if x == "quit" then return () else quitYet Output: (stuff in between {} is a comment, and not part of the output) rere ttt fff dfsd fgfg fgfg aaaaaaaaaaaaaaaaaa { and on and on } dfdf dfd fdfd fgfg fgf aaaaaaaaaaaaaaaa { and on and on } quit aaaaaaa { and on and on } {program ends} The behavior I wanted was for 'a' to be printed (almost) continuously, echo the relatively infrequent input, and quit upon receiving "quit". I am aware (through a web search) that there was a mail thread addressing a similar issue a while back (1999) entitled: I thought concurrent haskell was _preemptive_! That thread made it seem like the issue would be cleared up soon. In any case, I would still like to be able to have an interactive input thread that doesn't block everything in my program. Is there any way to do this? Thanks in advance, Walker