tl;dr: 新しいデータを処理できるようになるたびにメイン スレッドにシグナルを送信する QThread があります。次に、メイン スレッドがデータを取得、処理、表示します。データが到着する頻度が高くなり、メイン スレッドがそれを処理できるため、GUI がフリーズし、最終的にスタック オーバーフローが発生します (イェイ!)。
詳細
私のアプリケーションは、処理と表示のためにカメラからフレームを取得します。カメラは、Windows イベントを通じて新しいフレームが利用可能になると通知します。これらのイベントを定期的にチェックし、新しいフレームが取得可能になったときにメイン スレッドに通知するスレッドがあります。
void Worker::run()
{
running_ = true;
while (running_)
{
if (WaitForSingleObject(nextColorFrameEvent, 0) == WAIT_OBJECT_0)
emit signalColorFrame();
usleep(15);
}
}
signalColorFrame
Camera
カメラからフレームを取得し、何らかの処理を行い、MainWindow
それを画面に描画するクラスのスロットに接続されています。
void Camera::onNewColorFrame()
{
getFrameFromCamera();
processFrame();
drawFrame();
}
次のフレームが利用可能になる前にそのメソッドが完了した場合、すべてが正常に機能します。Camera
前のフレームの処理が完了する前に、クラスが新しいシグナルを受信しても、処理がより複雑になります。
私の解決策は、処理中はワーカー スレッドからのシグナルをブロックし、その間に偶数ループを強制的に実行することQCoreApplication::processEvents()
です。
void Camera::onNewColorFrame()
{
worker_->blockSignals(true)
getFrameFromCamera();
processFrame();
drawFrame();
QCoreApplication::processEvents(); // this is essential for the GUI to remain responsive
worker_->blockSignals(false);
}
それはそれを行う良い方法のように見えますか?誰かがより良い解決策を提案できますか?