使用Smalltalk中的超时读取文件流(命名管道)

时间:2014-01-09 15:23:54

标签: timeout named-pipes smalltalk blocking squeak

我也把它发布到了Squeak Beginners列表中 - 我确定要确保从那里得到任何答案:)

我使用Squeak 4.2并处理命名管道连接的smalltalk端,该连接使用以下命令向命名管道服务器发送消息:

    msg := 'Here''s Johnny!!!!'. 
    pipe nextPutAll: msg; flush. 
然后它应该收到一个确认,它将是收到的消息的3​​2字节md5哈希值(smalltalk应用程序随后可以验证)。命名管道服务器可能已经消失或者无法处理请求,因此我想在读取确认时设置超时。我尝试过使用它:

    ack := [ pipe next: 32 ] valueWithin: (Duration seconds: 3) onTimeout: [ 'timeout'. ]. 

然后人工暂停管道服务器以测试代码。但是,smalltalk线程在读取时阻塞并且不会继续(即使在超时之后),但是如果我然后让管道服务器发送正确的响应(例如在5秒延迟之后),则值为' ACK'是超时'。显然,超时已经完成了它应该做的事情,但是无法解除阻止。管道上的阻塞读取。

即使使用阻塞的FileStream读取,有没有办法实现这一点?如果可能的话,我宁愿避免忙碌等待有32个字符可用。

1 个答案:

答案 0 :(得分:0)

这个可能会派上用场,但恐怕不会出现在Windows上。

http://www.samadhiweb.com/blog/2013.07.27.unixdomainsockets.html