はじめに
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");
}
}
}