1

興味深い問題があります。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 シグナルをキャッチする方法がわかりません。

4

3 に答える 3

0

さて、そのようなアプローチを検討してください。グローバルで、関数が呼び出されたかどうか (または何回か) を示すフラグを設定する (またはカウンターをインクリメントする) 以外は、コールバック関数に何もさせないようにします。次に、QObjectから継承されたクラスを実装します(スロットを持つため)。スレッド終了シグナルにサブスクライブします。シグナルが発行されると、lib によって呼び出された回数だけ (コールバック関数のロジックを使用して) 別の関数を呼び出すだけです。それはうまくいきますか?

于 2012-04-13T18:46:30.020 に答える
0

スレッドが「手元」にあり、作業の終了後にスレッドが終了することを完全に確信している場合。

http://qt-project.org/doc/qt-4.8/qthread.html#wait

しかし!

スレッドを終了させたくない場合、ワーカーがシグナルを発するまで待ちたい場合は、次のようにします。

QEventLoop loop;
connect(worker, SIGNAL(workFinished()), &loop, SLOT(quit()));
QMetaObject::invokeMethod(worker, "doWork", Qt::QueuedConnection);
loop.exec();
于 2012-04-13T18:46:48.487 に答える