0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Apache FlexでWorkerを利用する

Posted at

はじめに

Apache FlexでのWorkerの使い方を簡単にまとめます。
時間がかかる処理を実行すると画面側での待ち時間が発生しますが、
Workerを利用して並行して実行することで、画面側での待ち時間が発生しなくなります。

簡単な例

例として、Sub.asに時間がかかる処理を記述していて、Main.mxmlでその処理を呼び出して実行したいとする。

Main.mxmlで以下のようにしてSub.swfを読み込み後、

[Embed(source="../Sub.swf", mimeType="application/octet-stream")]
private var subClass:Class;

以下のようにすることで実行することができる。

var worker:Worker = WorkerDomain.current.createWorker(new subClass());
worker.start();

Main.mxml、Sub.asの内容は後述。
(時間がかかる処理の代わりとして、5秒スリープするだけの処理を記述している)

「Mainで実行」ボタンをクリックした時は、画面側での待ち時間が発生するが、
「Subで実行」ボタンをクリックした時は、Workerを利用しているため、画面側での待ちは発生しない。

今回の場合、以下のように先にSub.asをコンパイルしてSub.swfを作成しておく必要がある。

> amxmlc src/Sub.as -output Sub.swf -debug=true
> amxmlc src/Main.mxml -output Main.swf

※Sub.asのtrace("Sub finished");の出力内容を確認するため、Sub.asの方は-debug=trueを指定してコンパイルしている。

Main.mxml

Main.mxml
<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
                       xmlns:s="library://ns.adobe.com/flex/spark"
                       xmlns:mx="library://ns.adobe.com/flex/mx">
    <fx:Style>
        * { 
            fontFamily: "Meiryo";
        }
    </fx:Style>

    <fx:Script>
        <![CDATA[
            import mx.controls.Alert;

            [Embed(source="../Sub.swf", mimeType="application/octet-stream")]
            private var subClass:Class;

            private function sleepMain():void {
                // 5秒スリープ
                var time:Number = new Date().getTime();
                while (new Date().getTime() - time < 5000) {
                }

                Alert.show("完了");
            }

            private function sleepSub():void {
                var worker:Worker = WorkerDomain.current.createWorker(new subClass());
                worker.start();

                Alert.show("完了");
            }
        ]]>
    </fx:Script>

    <s:Button label="Mainで実行" left="10" top="10" click="sleepMain();" />
    <s:Button label="Subで実行" left="10" top="40" click="sleepSub();" />
</s:WindowedApplication>

Sub.as

Sub.as
package {
    import flash.display.Sprite;

    public class Sub extends Sprite {
        public function Sub() {
            // 5秒スリープ
            var time:Number = new Date().getTime();
            while (new Date().getTime() - time < 5000) {
            }

            trace("Sub finished");
        }
    }
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?