プログラムを任意の秒数止めるWorkerのサンプル作った

By ton1 Comment

はいタイトルの通りです
Workerを使って、任意のコード中で任意の秒数だけプログラムをストップさせることができます
Java分かる人は、Thread.sleep()と同じです

Workerで何できるかなーって考えてたら唐突に思いついた
Workerは非同期処理のためのものだけど、実は同期処理できるんです

プロジェクト一式ははgitにあげました
Flash Builder 4.7 でインポートしてください
ton1517/Waiter · GitHub

クラスは3つしかありません

  • テスト用のドキュメントクラス WaitTest.as
  • Workerを意識せずに使用できるようにラップした Waiter.as
  • Workerとして動かす WaitWorker.as

何をしてるか見て行きましょう

まずサンプルとしてのWaitTest.as

WaitTest.as

package
{
	import flash.display.Sprite;
	import flash.utils.getTimer;

	public class WaitTest extends Sprite
	{
		public function WaitTest()
		{
			traceTime();			
			Waiter.wait(1000);	
			traceTime();			
			Waiter.wait(3000);	
			traceTime();			
			Waiter.wait(2000);	
			traceTime();			
		}

		private function traceTime():void
		{
			trace("time : " + getTimer());
		}
	}
}

Waiter.wait()しているだけですね
これで任意の秒数そこでストップしてくれるんです!すごくね??すごくない・・・?

次に、Waiter.wait()の中身

Waiter.as

package
{
	import flash.system.MessageChannel;
	import flash.system.Worker;
	import flash.system.WorkerDomain;
	import flash.utils.ByteArray;

	public class Waiter
	{
		[Embed(source="../workerswfs/WaitWorker.swf", mimeType="application/octet-stream")]
		private static var WaitWorker_ByteClass:Class;

		public static function wait(time:Number):void
		{
			var worker:Worker = WorkerDomain.current.createWorker(new WaitWorker_ByteClass as ByteArray);
			var inChannel:MessageChannel = worker.createMessageChannel(Worker.current);
			worker.setSharedProperty("channel", inChannel);
			worker.setSharedProperty("time", time);
			worker.start();
			inChannel.receive(true);
		}
	}
}

こんだけ
WaitWorker.swfっていうのをWorkerで読み込んで、秒数を渡してスタート
結果を受け取るまで待ってるだけです
一番重要なのは

inChannel.receive(true);

引数をtrueとすることで、結果が返ってくるまでずっとそこで止まっててくれるんです
これがあるからwaitできるわけです
サンプルだから手抜きしてるけど、waitメソッド呼ぶたびにWorker起動するのは重いので
どっかで1回起動して、それを使いまわすのが正解かなーと思います

最後はWorkerとして動かす WaitWorker.as

WaitWorker.as

package
{
	import flash.display.Sprite;
	import flash.events.TimerEvent;
	import flash.system.MessageChannel;
	import flash.system.Worker;
	import flash.utils.Timer;

	public class WaitWorker extends Sprite
	{
		private var outchannel:MessageChannel;

		public function WaitWorker()
		{
			super();

			outchannel = Worker.current.getSharedProperty("channel");

			var time:Number = Worker.current.getSharedProperty("time") as Number;

			var timer:Timer = new Timer(time, 1);
			timer.addEventListener(TimerEvent.TIMER_COMPLETE, timerComplete);
			timer.start();
		}

		protected function timerComplete(event:TimerEvent):void
		{
			outchannel.send("complete");
		}
	}
}

なんのこっちゃないです
秒数をメッセージとして受け取ったらその秒数のTimerを起動し、時間になったら”complete”というメッセージを送ってるだけです
メッセージに得に意味はなく、sendすればいいだけです

簡単ですね!

WorkerはFlash Player 11.4から搭載された機能で、つい最近でたばかりなのでまだみんな何ができるか模索中です
んなので、こんなことできるよ!ってのがあればどんどんアウトプットしてほしいです!

WorkerのAPIはまだ日本語化されてなくて、BETAのASDoc(英語)で見ることができます
Worker – BETA ActionScript® 3 (AS3 ) Reference for the Adobe® Flash® Platform API Reference

Workerの使い方は上条さんのブログが参考になります
ActionScript Worker (Flash Player マルチスレッド) の基本的な使い方 – akihiro kamijo

また、AKABANAさんがWorkerを楽に使えるライブラリを開発してくださっています
サンプルも豊富で勉強になるので一度ソースを読んでみることをおすすめします
as3concurrency について « AKABANA

ホントはFlash Builder 4.7の記事を先に書きたかったんだけど、、、w


AS3, Flash, 作ってみた

One Comment to “プログラムを任意の秒数止めるWorkerのサンプル作った”

  1. […] プログラムを任意の秒数止めるWorkerのサンプル作った | ton-up blog – とんぶろ. […]

Leave your Comment

メールアドレスが公開されることはありません。

Blue Taste Theme created by Jabox