2012-02-11 72 views
1

我正在寫一個需要進程間通信的程序。球拍中的子過程

我的代碼:

#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))])) 

和player1.exe代碼:

#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

我重新縮進了代碼,使其更清晰一些。 – dyoo 2012-02-11 22:38:37

回答

4

player1.exe文件中的最後一行看起來很可疑。 flush-output實際上並未作爲函數應用。而不是

flush-output (current-output-port) 

你大概的意思是:

(flush-output (current-output-port)) 

從外觀風格上看:功能readwrite,並flush-output在默認情況下的電流輸入和輸出端口的所有工作,所以你不不需要提供它們。看看這些功能的文檔,如flush-output,你會發現它提到current-output-port是它的默認設置。

所以,我們只是看着行可以寫成:

(flush-output) 

更多的問題:不使用eq?比較字符串。改爲使用string=?。原因是可以有兩個字符串具有相同的文本內容,但eq?仍然能夠區分這兩個字符串。例如:

kui $ racket 
Welcome to Racket v5.2.1. 
> (eq? "a" (string-copy "a")) 
#f 
> (string=? "a" (string-copy "a")) 
#t 
+0

非常感謝。它有幫助。 – chom 2012-02-12 01:42:58