1

さて、Shoesの多くのことについてはよくわかりませんが、試行錯誤のアプローチでは、これまでのところ失敗しています。

ある種の計算を行うクラスがあり、時間がかかります。進行状況バーを表示して、終了時にユーザーが確認できるようにします。私の計算集約型の方法では、ブロックが渡された場合、その完了率が得られます。

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

これが私がShoesで言いたいことです

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 の 2 つのウィンドウ間でデータを共有するのは非常に面倒なことです。お勧めしません。代わりに、最初のウィンドウの内容を非表示にして、その場所にプログレス バーを表示します。

次に、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 に答える