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

时间:2011-06-16 10:16:51

标签: mysql ruby multithreading user-interface shoes

我正在尝试学习鞋子,并决定制作一个简单的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

1 个答案:

答案 0 :(得分:1)

我认为问题产生于由ruby而不是操作系统完成的调度。可能只是鞋子+ mysql的特殊情况。

作为一种解决方法,我建议您为脚本生成一个单独的进程,并在进程之间使用基于套接字或文件的通信。