我也将其发布到 Squeak 初学者列表中 - 我一定会确保从那里得到的任何答案都到达这里:)
我正在使用 Squeak 4.2 并在命名管道连接的 Smalltalk 端工作,该连接将消息发送到命名管道服务器:
msg := 'Here''s Johnny!!!!'.
pipe nextPutAll: msg; flush.
然后它应该收到一个确认,这将是收到消息的 32 字节 md5 哈希值(然后smalltalk应用程序可以验证)。命名管道服务器可能已经消失或无法处理请求,因此我想在读取确认时设置超时。我尝试过使用这个:
ack := [ pipe next: 32 ] valueWithin: (Duration seconds: 3) onTimeout: [ 'timeout'. ].
然后人为地让管道服务器暂停以测试代码。但是,smalltalk 线程会阻塞读取并且不会继续(即使在超时之后),尽管如果我随后让管道服务器发送正确的响应(例如,在 5 秒延迟后),'ack 的值' 是'超时'。显然,超时做了它应该做的事情,但无法“解锁”管道上的阻塞读取。
有没有办法即使在阻塞 FileStream 读取的情况下也能完成此任务?如果可能的话,我宁愿避免在有 32 个字符可用时进行忙碌的等待。
最佳答案
这个可能会派上用场,但恐怕在 Windows 上不行。
http://www.samadhiweb.com/blog/2013.07.27.unixdomainsockets.html
关于timeout - 在 Smalltalk 中读取超时的文件流(命名管道),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21024242/