Ruby Shoes и MySQL: GUI зависает, стоит ли использовать потоки? - PullRequest
1 голос
/ 16 июня 2011

Я пытаюсь изучить Shoes и решил создать простой графический интерфейс для построчного запуска SQL-скрипта.

Моя проблема в том, что в GUI нажатие кнопки, которая выполняет мою функцию,замораживает графический интерфейс на время, необходимое для выполнения скрипта.

При использовании длинных сценариев это может занять несколько минут.

У кого-то возникла аналогичная проблема (http://www.stackoverflow.com/questions/958662/shoes-and-heavy-operation-in-separate-thread), и было предложено просто поместить интенсивные материалы в поток: если я скопируюМатематический код из ранее упомянутого потока и заменить мой MySQL-код GUI работает без замораживания, так что, вероятно, намекает на проблему с тем, как я использую MySQL-адаптер?

Ниже приведена упрощенная версиякод:

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 Ответ

1 голос
/ 17 июня 2011

Я думаю, что проблема возникает из-за планирования, которое выполняется ruby, а не операционной системой. Наверное, просто особый случай с обувью + mysql.

В качестве обходного пути я бы предложил вам создать отдельный процесс для сценария и использовать связь между процессами на основе сокетов или файлов.

...