1

FDT6 で AS3 プロジェクトに取り組んでいます。最新の FLEX 4.6 と AIR 3.7 を使用しています。

スレッド処理を行うためにメイン アプリケーションに埋め込まれた worker.swf ファイルがあります。

MessageChannel クラスを使用して、2 つの間で情報を渡します。

メインクラスで私が定義した

private var mainToWorker:MessageChannel;
private var workerToMain:MessageChannel;

mainToWorker = Worker.current.createMessageChannel(worker);
workerToMain = worker.createMessageChannel(Worker.current);

mainToWorker では、メッセージのみを送信します。これらのメッセージでは、情報のバイト配列を送信します。情報は、'command' プロパティと 'props' プロパティを含むオブジェクトです。基本的に関数呼び出しのように動作します。command は関数名であり、props はその関数のデータを含むオブジェクトです。

mainToWorkerMutex.lock();
mainToWorker.send(ByteArrayUtils.ObjectToByteArray({command:"DoSomething", props:{propA:1,propB:7}}));
mainToWorkerMutex.unlock();

「message」および「props」パラメーターを含むバイトデータのみを送信することを除いて、workerToMain 変数でも同じことが起こります。

workerToMainMutex.lock();
workerToMain.send(ByteArrayUtils.ObjectToByteArray({command:"complete", props:{return:"result"}}));
workerToMainMutex.unlock();

健全性チェックとして、メッセージ チャネルが必要なものを取得していることを確認します。

FDT でビルドすると正常に動作しますが、フラッシュ ビルダーを介して ANT スクリプトを使用してビルドすると、workerToMain チャネルで「コマンド」イベントが返されることがあります。

メッセージチャネルを介して大量のデータを送信しています。それを過負荷にして、他のメッセージチャネルにバッファオーバーフローを引き起こしている可能性はありますか? どうしてそれが FB だけで起こっているのでしょうか?

私は自分のコードを何度もチェックしましたが、自分のコードにはそのメッセージを送り返しているものは何もないと確信しています。

4

2 に答える 2

0

それで、私は問題を見つけたようです。それを行っているのはByteArrayのようです。

ByteArray.toString() は基本的に、データを壊してしまうことがあります。つまり、本当に信頼できないということです。

http://www.actionscript.org/forums/showthread.php3?t=155067

"Jim Freer" のコメントを読むと、彼は文字列がどのようにこれを行うかについて言及しています。

私の解決策は、メッセージ チャネルで ByteArray データの代わりに JSON でエンコードされた文字列を使用するように切り替えることでした。そもそも bytearray データを使用していた理由は、クラス定義情報を保存したかったからです。JSON では保存できません。

于 2013-06-05T18:40:06.687 に答える