我正在尝试学习鞋子,并决定制作一个简单的GUI来逐行运行SQL脚本。
我的问题是在GUI中按下执行我的功能的按钮,冻结GUI执行脚本所需的时间。
使用长脚本可能需要几分钟时间。
有人有类似的问题(http://www.stackoverflow.com/questions/958662/shoes-and-heavy-operation-in-separate-thread),建议只是将密集的东西放在一个线程下:如果我从前面提到的线程中复制数学代码并替换我的mysql代码,那么GUI可以无需冻结,这可能暗示我如何使用mysql-adapter的问题?
以下是代码的简化版本:
problem.rb:
# copy the mysql-gem if not in gem-folder already
Shoes.setup do
gem 'mysql'
end
require "mysql"
# the function that does the mysql stuff
def someFunction
con = Mysql::real_connect("myserver", "user", "pass", "db")
scriptFile = File.open("myfile.sql", "r")
script = scriptFile.read
scriptFile.close
result = []
script.each_line do |line|
result << con.query(line)
end
return result
end
# the Shoes app with the Thread
Shoes.app do
stack do
button "Execute someFunction" do
Thread.start do
result = someFunction
para "Done!"
end
end
end
stack do
button "Can't click me when GUI is frozen" do
alert "GUI wasn't frozen?"
end
end
end
答案 0 :(得分:1)
我认为问题产生于由ruby而不是操作系统完成的调度。可能只是鞋子+ mysql的特殊情况。
作为一种解决方法,我建议您为脚本生成一个单独的进程,并在进程之间使用基于套接字或文件的通信。