簡體   English   中英

球拍中的子流程

[英]subprocess in racket

我正在編寫一個需要流程之間進行通信的程序。

我的代碼:

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

如果沒有循環運行,我將得到輸出。 當只有玩家正在發送消息時,我也會得到輸出。 但是隨着服務器和播放器都發送消息,程序被掛起。 您認為問題是什么?

player1.exe文件的最后一行看起來可疑。 實際未將flush-output用作函數。 而不是

flush-output (current-output-port)

您可能是說:

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

從樣式的角度來看:默認情況下,函數readwriteflush-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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM