興味深い問題があります。Qt を使用して C++ プロジェクトに取り組んでいます。クロスプラットフォーム プロジェクトですが、Win 上で開発しています。
C スタイルのコールバック関数があります。C スタイルである必要があります。選択の余地はありません。その C スタイルのコールバック関数で行われる作業は重要であり、時間に敏感です。そのため、いくつかの Qthread スレッドがワークロードに役立ちます。
私は Qt スレッドで実行スキームを使用していませんが、QThread ドキュメントの下部で説明されているように QThreads を使用しています。http://qt-project.org/doc/qt-5.0/qthread.html#wait
わかりやすくするために、QThread を次のように使用しています。
QThread *thread = new QThread;
Worker *worker = new Worker;
worker->moveToThread(thread);
thread->start();
QMetaObject::invokeMethod(worker, "doWork", Qt::QueuedConnection);
スレッドはアプリケーションの開始時に作成され、QMetaObject::invokeMethod で供給されます。
課題は、QThread スレッドが作業を完了するまで、C コールバック関数に (効率的な方法で) 「何も」させないようにすることです。CPU とワーカー スレッドが競合しないように、コールバック関数を待機させたいと思います (ビジー状態のダミー ループはありません)。sleep() のようなものを使用することもできますが、スレッドが「早く」終了すると無駄なスリープが発生するため、これは効率的ではありません。ワーカーからシグナルを送信することを考えましたが、コールバックが C 関数であるため、Qt シグナルをキャッチする方法がわかりません。