2012-02-11 9 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

答えて

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=?を使用してください。その理由は、同じテキストコンテンツを持つ2つの文字列が存在する可能性がありますが、それでもeq?は2つの文字列を区別することができるからです。例:

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

ありがとうございました。それは助けになった。 – chom