Ruby Shoes GUI设置端口不能与线程一起使用

时间:2016-02-18 16:17:22

标签: ruby multithreading shoes

如果我不使用线程,我通常可以在端口声明中使用@which_port.text.to_i。如果我使用一个帖子,看起来这句话@which_port.text.to_i不起作用。我只能手动编写端口,例如6000然后我的计划运作良好。我必须使用线程,因为我的程序冻结了。尽管使用了线程,有没有办法能够使用@which_port.text.to_i

require 'socket'
require 'thread'

Shoes.app do

def write
    @t = TCPSocket.new("xx.xx.xx.xx", @which_port.text.to_i)
    loop do
        msg = @t.recv(4096)
        @pa1.text = @pa1.text + msg
    end
end 

@btn = button("button", width: 80, height: 50) do
    window(left: 300, top: 300) do
    @pa1 = para ""
    @th1 = Thread.new { write }
   end
end

@e_ln = edit_line(width: 320, height: 25, margin_top: 5)

@which_port = list_box :items => ["5000", "6000", "7000"],
    :width => 120,
    :choose => "5000" do |list| 
    end
end
end

2 个答案:

答案 0 :(得分:2)

每次启动窗口时,您都会启动一个全新的应用程序,以便其他应用程序中的新应用程序中的变量以及第一个应用程序中的变量,即触发窗口方法的应用程序中的变量新应用程序不知道!幸运的是,每个Shoes应用程序都有一个所有者方法,在您的案例中,在新应用程序中调用的所有者为您提供了对第一个应用程序的引用,即拥有新应用程序的应用程序! 一种做你想做的事情(线程与否):

Shoes.app title: "Main Shoes app" do
    def write(paragr)
        msg = "#{self.inspect} === #{@which_port.text}"
        paragr.text = paragr.text + msg
    end

    @btn = button("button", width: 80, height: 50) do
        window(left: 300, top: 300, title: "Another Shoes app") do
            @pa1 = para ""
            Thread.new { owner.write(@pa1) }
        end
    end


    @which_port = list_box :items => ["5000", "6000", "7000"],
                           :width => 120,
                           :choose => "5000" do |list|
    end
end

您还可以调查Shoes.APPS方法,该方法可以返回包含所有已打开应用的数组。

答案 1 :(得分:1)

如果这是Shoes 4,则线程很可能无法访问UI(只有主线程可以访问UI)。您可以尝试预先提取值,然后将其作为参数传递:

def write(port)
  #...
end

port = @which_port.text.to_i
@th1 = Thread.new { write(port) }