Сегодня я попытался выполнить некоторую фоновую работу с классом рабочего класса AS3.AS3 Рабочий не работает должным образом во время отладки или выпуска Flash CC CC, за исключением тех случаев, когда опубликовано
Однако я испытываю странное поведение, когда developping мой AIR настольных приложений в Flash-CC на Windows 7. Рассмотрим простой файл для основного «нить»:
////////////////
// MainThread.as
////////////////
package{
import flash.display.*;
import flash.system.*;
import flash.events.*;
import flash.utils.*;
public class MainThread extends MovieClip
{
[Embed(source="WorkerThread.swf", mimeType="application/octet-stream")]
private static var WORKER_SWF:Class;
var mainToWorker:MessageChannel;
var workerToMain:MessageChannel;
var workerToMainStartup:MessageChannel;
public function MainThread()
{
var workerBytes:ByteArray = new WORKER_SWF() as ByteArray;
var worker:Worker = WorkerDomain.current.createWorker(workerBytes, true);
// Send to worker
mainToWorker = Worker.current.createMessageChannel(worker);
worker.setSharedProperty("mainToWorker", mainToWorker);
// Receive from worker
workerToMain = worker.createMessageChannel(Worker.current);
workerToMain.addEventListener(Event.CHANNEL_MESSAGE, onWorkerToMain);
worker.setSharedProperty("workerToMain", workerToMain);
// Receive startup message from worker
workerToMainStartup = worker.createMessageChannel(Worker.current);
workerToMainStartup.addEventListener(Event.CHANNEL_MESSAGE, onWorkerToMainStartup);
worker.setSharedProperty("workerToMainStartup", workerToMainStartup);
worker.start();
trace("hi");
}
private function onWorkerToMain(ev:Event): void
{
}
private function onWorkerToMainStartup(ev:Event): void
{
var success:Boolean = workerToMainStartup.receive() as Boolean;
trace(success);
if (!success)
{
// ... handle worker startup failure case
}
}
}
}
а затем этот файл для рабочего (SWF-файл этого построен в FlashDevelop):
//////////////////
// WorkerThread.as
//////////////////
package{
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.system.*;
import flash.events.*;
import flash.filesystem.*;
public class WorkerThread extends MovieClip
{
public var mainToWorker:MessageChannel;
public var workerToMain:MessageChannel;
public var workerToMainStartup:MessageChannel;
public function WorkerThread()
{
// Receive from main
mainToWorker = Worker.current.getSharedProperty("mainToWorker");
mainToWorker.addEventListener(Event.CHANNEL_MESSAGE, onMainToWorker);
// Send to main
workerToMain = Worker.current.getSharedProperty("workerToMain");
// Send startup message to main
workerToMainStartup = Worker.current.getSharedProperty("workerToMainStartup");
workerToMainStartup.send(true);
trace("Hello from worker world.");
var file:File = File.desktopDirectory.resolvePath("MyTextFile.txt");
var stream:FileStream = new FileStream();
stream.open(file, FileMode.WRITE);
stream.writeUTFBytes("ZA WARUDO.");
stream.close();
}
private function onMainToWorker(event:Event): void
{
}
}
}
Вот проблемы, я испытывающие при создании и запуске приложения из Flash-CC:
- Следы от рабочего мира не могут быть обнаружены в отладчике Flash CC.
- Слушатель onWorkerToMainStartup никогда не запускается, несмотря на работу рабочего (трассировка
worker.state
после короткой задержки подтвердит это). - Работник должен написать файл, но это никогда не произойдет.
Однако ...
- Работник запишет файл, как только я перестану отладчик в Flash-CC.
- После публикации приложения и его выполнения из проводника Windows он работает так, как должно быть (это означает, что файл написан в фоновом режиме, в то время как приложение запускается, как и ожидалось).
Это безумие. Почему это происходит?
Спасибо.