39 lines
1.1 KiB
Nim
39 lines
1.1 KiB
Nim
|
when not(compileOption("threads")):
|
||
|
{.fatal: "Please, compile this program with the --threads:on option!".}
|
||
|
|
||
|
import chronos # an efficient library for async
|
||
|
|
||
|
proc processInput(rfd: AsyncFD) {.async.} =
|
||
|
echo "Type something below to see if the multithread IO works:\nType 'exit' to exit."
|
||
|
|
||
|
let transp = fromPipe(rfd)
|
||
|
while true:
|
||
|
let a = await transp.readLine()
|
||
|
|
||
|
if a == "exit":
|
||
|
quit(0);
|
||
|
|
||
|
echo "You just entered: " & a
|
||
|
|
||
|
proc readInput(wfd: AsyncFD) {.thread.} =
|
||
|
## This procedure performs reading from `stdin` and sends data over
|
||
|
## pipe to main thread.
|
||
|
let transp = fromPipe(wfd)
|
||
|
|
||
|
while true:
|
||
|
let line = stdin.readLine()
|
||
|
discard waitFor transp.write(line & "\r\n")
|
||
|
|
||
|
proc main() {.async.} =
|
||
|
let (rfd, wfd) = createAsyncPipe()
|
||
|
if rfd == asyncInvalidPipe or wfd == asyncInvalidPipe:
|
||
|
raise newException(ValueError, "Could not initialize pipe!")
|
||
|
|
||
|
var thread: Thread[AsyncFD]
|
||
|
thread.createThread(readInput, wfd)
|
||
|
|
||
|
await processInput(rfd)
|
||
|
|
||
|
when isMainModule: # isMainModule = true when the module is compiled as the main file
|
||
|
waitFor(main())
|
||
|
|