問題の多い MFC アプリケーションを書き直しています。主な問題は、不安定なことです。
USB経由で外部モジュールと通信するGUIアプリケーションです。そのため、タイマーを使用して、n ミリ秒ごとに通信スタックを実行します。ただし、システム コールはタイマー コールバック内では許可されていないため、プログラムが不安定になり、クラッシュして頻繁にハングアップします。
そのため、バックグラウンド スレッドで通信スタックを実行するようにアプリケーションを書き直す必要があります。ここでのもう 1 つの問題は、データがプレゼンテーションから完全に分離されていないことです。別のスレッドを使用する場合は、共有リソースを確実に保護する必要があります。
そのため、主に通信スタックが新しいデータがあることをアプリケーションに通知します。これは、ワーカー スレッドで処理する必要があります。通信スタックを実行し、新しいメッセージを処理し、更新中にデータ構造体をロックしてから、モジュールに応答します。次に、PostMessage を含むメッセージをメイン スレッドに送信して、GUI を更新します。
ただし、ユーザーは、外部モジュールにデータを送信するようにアプリケーションに指示することもできます。これには 3 つの方法があります。 1. データを 1 回送信します。MAIN スレッドはメッセージをワーカー スレッドに送信し、メッセージをキューから取り出してモジュールに送信します。2. 定期的にデータを送信します。これには、ワーカー スレッド内でタイマーを使用するか、フラグで十分な場合があり、スレッド更新関数のループごとにデータを送信する必要があります。3. モジュールにメッセージを送信し、応答を待ちます。これには、タイマーを使用してワーカー スレッド内のタイムアウトをチェックする必要があります。メッセージを受信すると、ワーカー スレッドは MAIN スレッドに通知する必要があるため、応答で GUI を更新できます。
1. 通信スタックを別のスレッドで実行します。通信スタックはステート マシンであり、それを呼び出すと、一度新しいデータをチェックして実行されます。while ループはありません。API で関数を呼び出してデータを送信することもできます。
何かが起こったときに GUI を更新するために MAIN スレッドにメッセージを送信します。
ワーカー スレッドにメッセージを送信して、アプリケーションからデータを送信するように指示します。
私の質問は次のとおりです。1. MFC は Document/View モデルを使用します。これを自分がやりたいことと一致させる最善の方法を見つけるのに苦労しています。または、それを部分的に放棄したい場合 (ドキュメントをスキップして、データを保存する独自の方法があります)。* データを整理するにはどうすればよいですか? すべてのアプリケーション データを含む 1 つの大きな構造体があり、アクセス時にワーカーとメイン スレッドの両方がそれをロックする必要がありますか? * GUI を更新するために MAIN スレッドにメッセージを送信する場合、どのようにメッセージを関数にマッピングするのが最適ですか? MESSAGE_MAP を使用していますか? しかし、メッセージ マップはスレッドではなくウィンドウ用ですか? MAIN スレッドのみが GUI にアクセスすることを確認する必要があります。GUI のそれぞれの異なる変更を特定の機能にマップする必要があります。GUI には 1 つの均一な表示ではなく、多数の異なるタブ (メッセージ ログ、オブジェクト、
- メッセージはどのように処理されますか? ワーカー スレッドは、スタックを通常どおりに実行することと、アプリケーションがメッセージを送信するように指示することの両方でスタックにアクセスできるため、別の呼び出しが行われる前に、スタックへの 1 つの呼び出しを終了する必要があります。新しいメッセージを処理する前に、スレッドの更新が常に終了する場合、これは問題ではありません。または、タイマーがヒットしたとき、または MAIN スレッドから新しいメッセージを受け取り、スタックの処理も開始したときに、スタック内にいる可能性がありますか? たぶん、他のスレッドだけでなく、ワーカースレッド自体が「同時に」2つの方法でスタックにアクセスしないようにするために、スタックをロックする必要があります。