我正在编写一个需要进程间通信的程序。
#lang racket
(define-values (sp o i e) (subprocess #f #f #f "c://player1.exe" ))
(define count 10)
(for ([c (in-naturals)])
(cond
[(equal? count 0) (error "Province is empty!") ]
[else
(write "server" i)
(set! count (sub1 count))
(flush-output i)
(display (read o))]))
#lang racket
(define (interact notification)
(cond
[(eq? notification "server") (write "true" (current-output-port))]
[else (write "false" (current-output-port))]))
(for ([c (in-naturals)])
(interact (read (current-input-port)))
(write "player" (current-output-port))
(sleep 0.1)
flush-output (current-output-port))
如果我没有循环运行,我会得到输出。当只有玩家发送消息时,我也得到输出。但是,如果服务器和播放器都发送消息,程序就会被挂起。 您认为问题是什么?
答案 0 :(得分:4)
player1.exe
文件中的最后一行看起来很可疑。 flush-output
实际上并未作为函数应用。而不是
flush-output (current-output-port)
你可能意味着:
(flush-output (current-output-port))
从样式的角度来看:默认情况下,函数read
,write
和flush-output
都可以在当前输入和输出端口上工作,因此您无需提供他们。查看这些功能的文档,例如flush-output
,您会看到它提到current-output-port
是默认值。
所以我们刚才看到的那一行可以写成:
(flush-output)
更多问题:请勿使用eq?
来比较字符串。请改用string=?
。原因是可能有两个字符串具有相同的文本内容,但eq?
仍然能够区分这两个字符串。 e.g:
kui $ racket
Welcome to Racket v5.2.1.
> (eq? "a" (string-copy "a"))
#f
> (string=? "a" (string-copy "a"))
#t