Недавно я создал настольное приложение, которое позволяет пользователю импортировать данные Excel в SQLite. Я делаю это приложение, используя AIR for Desktop. До моего сведения дошло, что мое приложение зависнет, когда будет выполняться импорт. Поэтому я подумал, что использование Worker API в моем коде Actionscript поможет разморозить мое приложение при импорте данных. Этот вопрос связан с моим предыдущим вопросом .
Я прочитал Worker API , этот учебник и этот пример и я придумываю следующий код:
MainClass.as
package
{
// Import related class and API
public class MainClass extends MovieClip
{
[Embed(source = "WorkerThread.swf", mimeType = "application/octet-stream")]
private static var WORKER_SWF: Class;
private var bgWorker: Worker;
private var mainToWorker: MessageChannel;
private var workerToMainProgress: MessageChannel;
private var workerToMainResult: MessageChannel;
private var workerToMainStartup: MessageChannel;
public function MainClass()
{
initialize();
}
private function initialize(): void
{
// Setup the UI
setupStage();
createStatusText();
createProgressBar();
var workerBytes: ByteArray = new WORKER_SWF() as ByteArray;
// Create the background worker
bgWorker = WorkerDomain.current.createWorker(workerBytes);
// Send to worker
mainToWorker = Worker.current.createMessageChannel(bgWorker);
bgWorker.setSharedProperty("mainToWorker", mainToWorker);
// Receive progress from worker
workerToMainProgress = bgWorker.createMessageChannel(Worker.current);
workerToMainProgress.addEventListener(Event.CHANNEL_MESSAGE, onWorkerToMainProgress)
bgWorker.setSharedProperty("workerToMainProgress", workerToMainProgress);
// Receive result from worker
workerToMainResult = bgWorker.createMessageChannel(Worker.current);
workerToMainResult.addEventListener(Event.CHANNEL_MESSAGE, onWorkerToMainResult);
bgWorker.setSharedProperty("workerToMainResult", workerToMainResult);
// Receive startup message from worker
workerToMainStartup = bgWorker.createMessageChannel(Worker.current);
workerToMainStartup.addEventListener(Event.CHANNEL_MESSAGE, onWorkerToMainStartup);
bgWorker.setSharedProperty("workerToMainStartup", workerToMainStartup);
bgWorker.start();
setInterval(function ()
{
mainToWorker.send("ADD");
trace("ADD", "main");
}, 1000);
}
private function onWorkerToMainProgress(evt: Event): void
{
}
private function onWorkerToMainResult(evt: Event): void
{
}
private function onWorkerToMainStartup(evt: Event): void
{
var success: Boolean = workerToMainStartup.receive() as Boolean;
if (!success)
{
//... handle worker startup failure case
}
else
{
trace("start");
}
}
}
}
WorkerClass.as
package
{
// Import related class and API
public class WorkerClass extends Sprite
{
private var mainToWorker: MessageChannel;
private var workerToMainProgress: MessageChannel;
private var workerToMainResult: MessageChannel;
private var workerToMainStartup: MessageChannel;
public function WorkerClass()
{
initialize();
}
private function initialize(): void
{
// Receive from main
mainToWorker = Worker.current.getSharedProperty("mainToWorker");
mainToWorker.addEventListener(Event.CHANNEL_MESSAGE, onMainToWorker);
// Send to main
workerToMainProgress = Worker.current.getSharedProperty("workerToMainProgress");
workerToMainResult = Worker.current.getSharedProperty("workerToMainResult");
workerToMainStartup = Worker.current.getSharedProperty("workerToMainStartup");
}
private function onMainToWorker(event: Event): void
{
if (mainToWorker.messageAvailable)
{
var msg: String = mainToWorker.receive() as String;
if (msg == "ADD")
{
trace("ADD", "worker")
}
}
}
}
}
Когда я запускаю код, я вижу «ADD, main 'отслеживается каждые несколько секунд, но я не вижу' start 'или' ADD, worker ', поэтому я предполагаю, что мой работник не запускается даже после того, как я запускаю его, используя bgWorker.start();
. Имеет ли это какое-либо отношение к extend Sprite
, поскольку все учебное пособие и пример используют его вместо extend MovieClip
, как в моем MainClass.as
Я работал над этим в свое свободное время почти неделю, и я до сих пор не могу понять это. Мой партнер также пытался выяснить это со мной.