1

私たちのチームは、Windows に VNC ビューアー (=VNC クライアント) を実装しています。プロトコル (RFB と呼ばれる) はステートフルです。つまり、ビューアは 1 バイトを読み取って内容を確認し、さらに 3 バイトまたは 10 バイトを読み取って解析する必要があります。

非同期ソケットと単一 (UI) スレッドを使用することにしました。したがって、次の 2 つの方法があります。

1) ステート マシン -- ソケットの読み取りでブロックが発生した場合は、現在の状態を記憶して終了します。その後、ソケット通知が到着し、中断されたロジックが適切な段階から再開されます。

2) 内部メッセージ ループ -- ソケットからの読み取りがブロックされると判断すると、内部メッセージ ループに入り、必要なすべてのデータが最終的に受信されるまでそこでスピンします。したがって、ブロックの場合、UI はフリーズしません。

経験からわかるように、2 番目のアプローチは良くありません。内部のメッセージ ループにいる間にメッセージが届く可能性があるからです。ここですべてを語ることはできませんが、単純に信頼性が十分ではありません。クラッシュとクラッジ。

最初のオプションはかなり受け入れられるように見えますが、そのようなスタイルでプログラミングするのは簡単ではありません。アルゴリズムの状態と、さらなる処理に必要なすべてのローカル変数の値を覚えておく必要があります。

これは複数のスレッドを使用する可能性がありますが、この場合の問題はさらに難しいと考えていました: フレームバッファアクセスの同期、マルチスレッドの問題などです。非同期ソケットも同様です。

それで、あなたの意見では、どの方法が最善ですか?

問題はかなり一般的なものです。これは、ステートフル プロトコルを通じて非同期通信を編成する際の問題です。

編集 1: UI フレームワークとして C++ と MFC を使用します。

4

3 に答える 3

1

CSocket を気にしないでください。追加の制御 (中断、シャットダウンなど) が得られるため、最終的には CAsyncSocket に移動します。別のスレッドを使用して通信を管理することもお勧めします。これにより複雑さが増しますが、UI の応答性を維持することが最優先事項です。

于 2012-07-11T15:24:29.717 に答える
1

私はいくつかの並列コンピューティング プロジェクトを実行しましたが、MPI (Message Passing Interface) が VNC プロジェクトに役立つようです。MPI が提供する並列計算能力にはあまり関心がないかもしれませんが、ネットワーク経由の非同期通信用に簡略化されたソケットのようなインターフェイスを使用したい場合があります。

http://www.open-mpi.org/

MPI の他の実装と、Google の多数の使用例を見つけることができます。

于 2012-07-10T01:59:30.263 に答える