我想建立多线程应用程序。如果我不使用线程,一切正常。当我尝试使用线程时,浏览器上没有显示任何内容。当我使用语法'puts'%s“%io.read'然后它显示在命令提示符而不是浏览器上。任何帮助将不胜感激。
require 'sinatra'
require 'thread'
set :environment, :production
get '/price/:upc/:rtype' do
Webupc = "#{params[:upc]}"
Webformat = "#{params[:rtype]}"
MThread = Thread.new do
puts "inside thread"
puts "a = %s" %Webupc
puts "b = %s" %Webformat
#call the price
Maxupclen = 16
padstr = ""
padupc = ""
padlen = (Maxupclen - Webupc.length)
puts "format type: #{params[:rtype]}"
puts "UPC: #{params[:upc]}"
puts "padlen: %s" %padlen
if (Webformat == 'F')
puts "inside format"
if (padlen == 0 ) then
IO.popen("tstprcpd.exe #{Webupc}")
{ |io|
"%s" %io.read
}
elsif (padlen > 0 ) then
for i in 1 .. padlen
padstr = padstr + "0"
end
padupc = padstr + Webupc
puts "padupc %s" %padupc
IO.popen("tstprcpd.exe #{padupc}") { |io|
"%s" %io.read
}
elsif (padlen < 0 ) then
IO.popen("date /T") { |io|
"UPC length must be 16 digits or less." %io.read
}
end
end
end
end
答案 0 :(得分:3)
您的代码有几个问题:
Uppercase
个名称作为变量;这使它们成为常数!puts
不会输出到浏览器,而是输出到控制台。浏览器将接收块的返回值,即块中最后一个语句的返回值。因此,您需要以不同方式构建输出(见下文)。这是一个使用线程的最小sinatra应用程序。但是,在这种情况下,该线程没有意义,因为在将结果输出到浏览器之前,必须等待它的终止。为了构建输出,我使用了StringIO
,您可以使用puts
方便地构建多行字符串。但是,您也可以使用res
的空字符串初始化res = ""
,然后使用res << "new line\n"
将您的行追加到此字符串。
require 'sinatra'
require 'thread'
require 'stringio'
get '/' do
res = StringIO.new
th = Thread.new do
res.puts 'Hello, world!'
end
th.join
res.string
end