2

操作が完了するまで GUI がフリーズしないように、重い操作を別のスレッドで実行する方法はありますか? (ダウンロードに似ていますが、Swing の SwingWorker.class のようにより一般的です)。

私は次のことを試しました:

Thread.start { <heavy operation block is here> }

しかし、それは役に立ちませんでした。Shoes のメイン スレッドはまだ影響を受けているようです。

よろしくお願いします!

4

1 に答える 1

1

あなたのコードを見ずに、私はあなたに特定のガイダンスを与えることができません。しかし、たとえば、このコードは私にとっては問題なく機能します。ダイアログが表示されている間に面倒な計算が完了すると、ダイアログを閉じてからしばらく経つまで結果が表示されないことに注意してください。ダイアログが表示されている間、靴はウィンドウAIを変更しません。試してみて、どのように動作するかを確認してください。そこから始めます。

Shoes.app do

  @window_slot = stack do
    button('Tell me about ponies') do
      @window_slot.append { para 'OMG PONIES!' }
    end
    button('I like dialogs') { alert 'I like dialogs, too!' }
    button('Does this button make things slow?') do
      Thread.new do
        @window_slot.append { para 'Why did you click that?  Are you crazy?!' }

        #Let's do a bunch of calculations!
        arr = []
        sum = 0
        0.upto(10000) do |i|
          0.upto(1000) do |j|
            sum += j
          end
          arr << sum
        end

        @window_slot.append { para arr.join(' ') }
      end
    end
  end
end
于 2009-06-06T01:55:39.943 に答える