Ruby Shoes和MySQL:GUI冻结,我应该使用线程吗?
我试图学习鞋子,并决定制作一个简单的GUI来逐行运行SQL脚本 我的问题是,在GUI中,按下执行我的函数的按钮会在函数执行脚本所需的时间内冻结GUI 对于长脚本,这可能需要几分钟 有人有一个类似的问题(),建议只是把密集型的东西放在一个线程下:如果我从前面提到的线程中复制数学代码并替换我的mysql代码,GUI就不会冻结,所以这可能暗示了我如何使用mysql适配器的问题 以下是代码的简化版本: problem.rb:Ruby Shoes和MySQL:GUI冻结,我应该使用线程吗?,mysql,ruby,multithreading,user-interface,shoes,Mysql,Ruby,Multithreading,User Interface,Shoes,我试图学习鞋子,并决定制作一个简单的GUI来逐行运行SQL脚本 我的问题是,在GUI中,按下执行我的函数的按钮会在函数执行脚本所需的时间内冻结GUI 对于长脚本,这可能需要几分钟 有人有一个类似的问题(),建议只是把密集型的东西放在一个线程下:如果我从前面提到的线程中复制数学代码并替换我的mysql代码,GUI就不会冻结,所以这可能暗示了我如何使用mysql适配器的问题 以下是代码的简化版本: problem.rb: #如果mysql gem尚未在gem文件夹中,请复制它 鞋子,你喜欢吗 宝石
#如果mysql gem尚未在gem文件夹中,请复制它
鞋子,你喜欢吗
宝石“mysql”
结束
需要“mysql”
#完成mysql内容的函数
def someFunction
con=Mysql::real_connect(“myserver”、“user”、“pass”、“db”)
scriptFile=File.open(“myfile.sql”、“r”)
script=scriptFile.read
scriptFile.close
结果=[]
script.each|u line do|line|
结果我认为问题是由ruby而不是操作系统完成的调度引起的。可能只是鞋+mysql的特例
作为一种解决方法,我建议您为脚本生成一个单独的进程,并在进程之间使用套接字或基于文件的通信。我认为问题产生于由ruby而不是操作系统完成的调度。可能只是鞋+mysql的特例
作为一种解决方法,我建议您为脚本生成一个单独的进程,并在进程之间使用套接字或基于文件的通信
# 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