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

 

 

 

Reply via email to