actionscript-3 - 在 AIR for Desktop 中使用 Worker 不起作用
问题描述
最近我制作了一个桌面应用程序,允许用户将 Excel 数据导入 SQLite。我使用 AIR for Desktop 制作了这个应用程序。我注意到,当此导入正在进行时,我的应用程序将冻结。所以我认为在我的 Actionscript 代码中使用 Worker API 将有助于在导入数据时解冻我的应用程序。这个问题与我之前的问题有关。
我阅读了Worker API、本教程和本示例,并提出了以下代码;
主类.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");
}
}
}
}
工人类.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")
}
}
}
}
}
当我运行代码时,我可以看到每隔几秒钟就会跟踪一次“添加,主”,但我没有看到“开始”或“添加,工人”,所以我假设我的工人即使在我启动它之后也没有运行使用bgWorker.start();
. 这有什么关系,extend Sprite
因为所有教程和示例都使用它而不是extend MovieClip
像我的 MainClass.as
我已经在空闲时间做了将近一个星期的工作,但我仍然无法弄清楚。我的搭档也一直想和我一起解决这个问题。
解决方案
推荐阅读
- c# - 如何禁用 EventSource 事件的堆栈?
- javascript - 在尝试将表单数据下载为纯文本时,我希望将数组数据转换为字符串并显示在文本文件中
- python - Debian 模块中的 PyQt5 依赖项
- python - Pandas DataFrame - 行到列的字典
- android - AccessibilityNodeInfo.ACTION_CLICK 不执行点击
- c - 训练单节课时没有物体检测
- rust - 如何将类型参数指定为 Rust 中的函数参数?
- perl - 在 Windows 10 上使用草莓 perl 安装 Net::Pcap
- sql - 如何计算同一个表中的多个列?
- ffmpeg - 来自图像的视频,但只有 imagemagick 创建了像素化