私は興味深い問題があります。 Qtを使ったC++プロジェクトの作業。クロスプラットフォームのプロジェクトですが、Winで開発しています。Qthreadが効率よく作業を終了するようにC関数を待たせるには?
私はCスタイルのコールバック関数を持っています。それはCスタイルにする必要があります、私はそれについての選択肢がありません。 そのCスタイルのコールバック関数で行われた作業は重要で時間に敏感です。したがって、Qthreadスレッドは作業負荷に役立ちます。
私はQtスレッドで実行スキームを使用していません。むしろQThreadsの下に説明されている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が供給されます。
Qコールは、QThreadスレッドが処理を完了するまで、「何か」(効率的な方法で)コールバック関数を持たないようにしてください。私は、コールバック関数がワーカースレッドとCPUのために競合しないような方法で待機するようにしたいと思います(ビジーなダミーループはありません)。私はsleep()のようなものを使うこともできますが、スレッドが「早く」終了すると無駄な睡眠になるので効率的ではありません。私は労働者からのシグナルを送ることを考えましたが、問題は私のコールバックがC関数なので、Qtシグナルをどのように捕まえることができないのか分かりません。
Can'tあなたはそこにQtのクラスとキャッチ信号とC-機能をラップ? – dvvrd
いいえ、できません。 C関数は単なるC関数ではなく、コールバック関数です。 libの一部。私はその性質を変えることはできません、私はその体を実装することしかできません。私は何/誰がコールバックを呼び出す権限がありません、私はそれをCのコールバック関数を保持する必要があります。 – L123