Ruby Shoes和MySQL:GUI冻结,我应该使用线程吗?

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文件夹中,请复制它 鞋子,你喜欢吗 宝石

我试图学习鞋子,并决定制作一个简单的GUI来逐行运行SQL脚本

我的问题是,在GUI中,按下执行我的函数的按钮会在函数执行脚本所需的时间内冻结GUI

对于长脚本,这可能需要几分钟

有人有一个类似的问题(),建议只是把密集型的东西放在一个线程下:如果我从前面提到的线程中复制数学代码并替换我的mysql代码,GUI就不会冻结,所以这可能暗示了我如何使用mysql适配器的问题

以下是代码的简化版本:

problem.rb:


#如果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