2014-05-21 145 views
0

我不明白爲什麼我的代碼不起作用。我有一個矢量,這個矢量在某些位置包含input-ports,在其他位置包含0。如果有input port,我想檢查是否有可用的數據。如果有數據可用,請閱讀並排入隊列。如果沒有,繼續前進。當字符準備好時從輸入端口塊中讀取

這裏是我的代碼:

;The name of the vector is 'in'. 
(define (read-ports) 
    (let loop 
    ((idx 0)) 
    (if (not (= idx (vector-length in))) 
     (let ((port (vector-ref in idx))) 
      (if (not (eq? port 0)) 
       (if (char-ready? port) 
        (let ((data (read port))) 
        (sendm buffer 'enqueue! data)) ;my own queue 
        (loop (+ idx 1))) 
       (loop (+ idx 1)))) 
     'done))) 

我的問題是,char-ready回報true,但read操作仍然塊!我確定數據正在發送,但爲什麼會被阻止?我試圖發送的數據是vectors,但這些數據包含的值介於0和255之間。實際上它們是vectorsbytes

在此先感謝

+3

'char-ready?'是真的,如果你可以使用'read-byte',而不是'read'。 – uselpa

+0

有什麼我可以用來檢查'讀''是否會阻止? – JNevens

+0

你確定你需要'read'嗎?我會研究'read-bytes- *'和'peek- *'程序。 – uselpa

回答

1

要回答你的問題是,問:

read塊,直到它可以讀取完整 s表達式。因此,如果您嘗試讀取向量#(1 2 3 4),則#(1 2部分的字節可能現在可供讀取 - 但不一定是其餘3 4)的字節。


作一般性的建議:

雖然我不知道你想完成什麼樣的背景下,這聽起來像你有N個input-port S,和你read-ports功能將嘗試讀取vector從每個端口,把結果放在一些中央buffer,然後返回'done。 (我不知道你是否會打電話read-ports一次,或重複。)

更好的設計可能將是使一個thread讀取每個port,並且讓每個線程把它的結果在中央緩衝區由使用異步通道來保護/協調對該緩衝區的訪問。所以你會有N個線程,每個線程讀取N個端口之一。

這樣,您不必擔心阻塞 - 每個線程都會調用read,並在完成時完成。 (OTOH這種設計意味着這些載體可能是無序讀出的;如果這很重要,可以用幾種方法處理。)

再一次,我不知道你確切的目標,但基本上我建議通過使用輕量級綠色線程和渠道與「球拍」一起工作。

+0

我正在使用線程來做到這一點,但我需要從我的代碼中刪除這些。 – JNevens