Почему with_progress делает "Thread.new"? - PullRequest
3 голосов
/ 10 сентября 2009

Этот код устанавливает драгоценные камни в ваш проект на основе манифеста драгоценного камня. Зачем для этого нужно создавать темы?

module Gemifest
  class Installer
    def initialize(gem)
      @gem = gem
    end

    def perform!
      begin
        $stdout = StringIO.new('')
        $stderr = StringIO.new('')
        with_progress 'Installing ' + @gem.name do
          `#{@gem_command} install --no-ri --no-rdoc #{@gem.line}`
        end
      ensure
        $stderr = STDERR
        $stdout = STDOUT
      end
    end

    private

    def with_progress(label)
      STDERR.print label
      begin
        t = Thread.new do
          loop do
            STDERR.print('.')
            STDERR.flush
            sleep 0.8
          end
        end
        yield
        STDERR.puts ' done!' unless $?.exitstatus > 0
      rescue => e
        STDOUT.puts "Error:"
        STDOUT.puts e.message
      ensure
        t.kill
      end
    end
  end
end

1 Ответ

3 голосов
/ 10 сентября 2009

Если вы удалите Thread.new, yield выполнится после того, как loop do ... end завершится (т.е. никогда).

Целью создания цикла в отдельном потоке является то, что он должен выполняться одновременно с блоком, а затем уничтожаться после его завершения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...