すべての着信メッセージを非常に高速に処理する必要があるWindowsアプリケーションがあります。そうしないと、システムのパフォーマンスがかなり低下すると思います。私が考えたのは、メッセージごとにスレッドを生成して結合し、それらが順番に処理されるようにする方法です。しかし、そのアプローチには深刻な問題があります。スレッドを生成してトップスレッドに参加しようとすると、参加できるかどうかをどのように知ることができますか?オフコース私はそれが参加可能かどうかをチェックできます(私はstd :: threadを使用します)が、それをしている間、それは単に参加できなくなり、スレッドはミューテックスではありません-私はそれをブロックしてもう一度チェックすることはできません。したがって、私が必要としているのは、少なくともメッセージスレッドに対して非ブロッキングである、ある種の遅延タスクプールまたはタスククエリです。ここでも、そのクエリを待機するスレッドを生成し、タスクを追加して処理できるようにすることができます。
それは必ずしも箱から出して機能するものではないでしょう、私は任意の同時パターンを実装することができます。
inb4:Windows、WinAPI、C ++ 11、スレッド用のstd::thread。私の英語で申し訳ありませんが、本当にそれを改善する時間が見つかりません。
ご回答ありがとうございます。問題の説明を間違えたようです。正確には、WNDPROCに結果をできるだけ早く返させるだけでよいので、次のメッセージをメッセージキューからポップできます。メッセージが送信された時間をログに記録するため、これが必要です。そのため、時間の測定に影響を与えないように、高速に実行する必要があります。また、これらのメッセージはシステムにとって緊急であり、私のウィンドウはそれらを高速に処理する必要があります。そうしないと、パフォーマンスに何らかの影響があります。
繰り返しますが、正確なメッセージ処理を他のスレッドに移動する必要があります。現在、次のようになっています。
case WM_INPUT:
int timestamp = PushTimeStampToAsyncTimestampQueue();
launchLongChainOfMessageProcessing(message,timestamp);
return 0;
そのlaunchLongChainOfMessageProcessingを取り除き、次のようなものに置き換える必要があります
case WM_INPUT:
int timestamp = PushTimeStampToAsyncTimestampQueue();
std::thread processThread([]() { do_work(message, timestamp);});
return 0;