如果我不使用线程,我通常可以在端口声明中使用@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
答案 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) }