首页
学习
活动
专区
圈层
工具
发布

多线程IO
EN

Stack Overflow用户
提问于 2014-08-11 00:08:55
回答 1查看 168关注 0票数 1

我正在尝试为Ruby做一个交互式的telnet客户端。当前的库非常缺乏,所以我一直在尝试通过创建一个交互式gem来添加它,它允许用户通过telnet实时简化数据。为此,我需要使用多线程:

t1接受用户输入。用户必须始终具有通过整个应用程序输入数据的能力。一旦用户数据被发送,我们将立即接收返回的数据,这些数据将被我们的块{ |c| print c }捕获。问题是我们希望数据对我们来说是流线型的。换句话说,现在我们只得到在我们发送命令后发回的数据,我们希望数据在我们发送命令后一分钟内收到。我们希望数据源源不断地流向我们。

我制作t2就是为了这个目的。t2等待接收数据,然后在匹配其正则表达式模式时显示该数据。t2的问题是,如果从未收到数据,则用户无法在t1中输入信息。

t3可以在t1和t2上运行。我的问题是,我如何组织我的线程,使用户可以不断地在控制台中键入和提交命令,同时不断地从服务器接收信息?

代码语言:javascript
复制
t1 = Thread.new {
  while true
    input = gets.chomp
    localhost.cmd(input) { |c| print c }
  end
}

t2 = Thread.new {
  puts localhost.waitfor("Prompt" => /[$%#>:?.|](\e\[0?m\s*)* *\z/)
}

t3 = Thread.new {
  t1.join
  t2.join
}

t3.join
EN

回答 1

Stack Overflow用户

发布于 2014-08-11 00:47:35

问题是,我们希望数据对我们来说是流线型的。换句话说,现在我们只能得到在我们发送数据后传回的数据,

代码语言:javascript
复制
require 'thread'

user_data = Queue.new

t1 = Thread.new do
  loop do
    print "Enter data: "
    line = gets.chomp

    if line == ""
      user_data << "END_OF_DATA"
      break
    else
      user_data << line
    end

  end
end.join

t2 = Thread.new do
  processed_data = []

  loop do
    line = user_data.shift
    break if line == "END_OF_DATA"
    processed_data << line
  end

  p processed_data
end.join

你可能想要读这篇文章:

https://www.rfc-editor.org/rfc/rfc854

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25230497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档