1

好的,所以我不太确定鞋子中的很多东西,但是到目前为止,我的反复试验方法让我在这方面失败了。

我有一个类进行某种需要一段时间的计算,我想抛出一个进度条供用户在它完成时查看。如果通过一个块,我的计算密集型方法会产生其完成百分比:

class MathyStuff

  def initialize()
  end

  ## Some expensive, time consuming method which yields it's percent complete
  def expensiveMethod(&block)
    0.upto(100) do |i|
      0.upto(100000) do |j|
        k = j;
      end

      yield i.to_f/100;
    end
  end

end

以下是我想鞋子中说的话:

require 'MathyStuff.rb'

Shoes.app do

  @myMathyStuff = MathyStuff.new();

  button("Do expensive mathy thing...") do
    window() do
      @progress = progress();
      @myMathyStuff.expensiveMethod() {|percent| @progress.fraction = percent;}
    end
  end

end

但这似乎不起作用。我尝试过使用/不使用窗口调用,我尝试过各种方式的 animate(),我什至尝试调用 Thread.new 并将它传递给窗口块,让它们通过 Shoes.APPS()[0].get 交谈/setPercent 方法;似乎没有什么能正常工作。

也许我没有按照预期的方式使用进度条。再说一遍,进度条还有什么用途?;-)

4

2 回答 2

5

首先,在 Shoes 的两个窗口之间共享数据是一件非常痛苦的事情。我不推荐它。相反,隐藏第一个窗口的内容并在其位置显示进度条。

其次,我们将扩展 MathyStuff 以将其从处理块转换为提供百分比属性,因此我们可以从动画线程访问它:

class MathyStuff
  attr_accessor :percent

  def expensiveMethodWrapper
    @percent = 0.0
    expensiveMethod {|x| @percent = x}
  end
end

Shoes.app do

  @myMathyStuff = MathyStuff.new();
  @window_slot = stack do
    button("Do expensive mathy thing...") do
      @window_slot.toggle
      @progress_slot = flow do
        @progress = progress :width => 1.0
      end
    end
    Thread.new do
        @myMathyStuff.expensiveMethodWrapper
    end
    @animate = animate do
      @progress.fraction = @myMathyStuff.percent
      if @myMathyStuff.percent == 1.0
        @progress_slot.remove
        @window_slot.toggle
        @animate.stop
      end
    end
  end
end
于 2009-05-02T18:57:32.380 回答
3

据我了解,进度条之类的内容需要在输入百分比值后重新绘制到屏幕上,这就是您在这种情况下使用动画的目的。

如果您只想做您在问题中所说的,那么这种方法 - 虽然不是很灵活 - 确实适用于您的示例。但是因为它将进度逻辑与实际方法分开,所以您只能在运行这些方法之前和之后更改百分比值。所以,既然你只是运行了 100 次迭代,那么你可以通过这种方式有效地完成它。

class Mathy
  def foo
    100000.times do |bar|
      foo = bar
    end
  end
end

Shoes.app do
  @mathy = Mathy.new
  button("Run") do
    @p = progress
    animate do |percent|
      break if percent > 100
      @mathy.foo
      @p.fraction = percent.to_f / 100
    end
  end
end

如果您的方法不仅仅是重复相同的迭代,那么是的,您希望在方法中经常产生它的进度。然后,为了在该方法运行时从该方法返回该进度,您可以按照 Pesto 的建议将它放在一个单独的线程中,然后轮询它以获取动画块中的进度。使用 attr_accessor 返回百分比也是一个好主意。希望有帮助。

于 2009-05-02T19:22:04.973 回答