私たちのチームは、Windows に VNC ビューアー (=VNC クライアント) を実装しています。プロトコル (RFB と呼ばれる) はステートフルです。つまり、ビューアは 1 バイトを読み取って内容を確認し、さらに 3 バイトまたは 10 バイトを読み取って解析する必要があります。
非同期ソケットと単一 (UI) スレッドを使用することにしました。したがって、次の 2 つの方法があります。
1) ステート マシン -- ソケットの読み取りでブロックが発生した場合は、現在の状態を記憶して終了します。その後、ソケット通知が到着し、中断されたロジックが適切な段階から再開されます。
2) 内部メッセージ ループ -- ソケットからの読み取りがブロックされると判断すると、内部メッセージ ループに入り、必要なすべてのデータが最終的に受信されるまでそこでスピンします。したがって、ブロックの場合、UI はフリーズしません。
経験からわかるように、2 番目のアプローチは良くありません。内部のメッセージ ループにいる間にメッセージが届く可能性があるからです。ここですべてを語ることはできませんが、単純に信頼性が十分ではありません。クラッシュとクラッジ。
最初のオプションはかなり受け入れられるように見えますが、そのようなスタイルでプログラミングするのは簡単ではありません。アルゴリズムの状態と、さらなる処理に必要なすべてのローカル変数の値を覚えておく必要があります。
これは複数のスレッドを使用する可能性がありますが、この場合の問題はさらに難しいと考えていました: フレームバッファアクセスの同期、マルチスレッドの問題などです。非同期ソケットも同様です。
それで、あなたの意見では、どの方法が最善ですか?
問題はかなり一般的なものです。これは、ステートフル プロトコルを通じて非同期通信を編成する際の問題です。
編集 1: UI フレームワークとして C++ と MFC を使用します。