ユーザーがカメラからビデオを見て記録できるプログラムを実行しています。QtMEL ライブラリを使用して、カメラ フィードと記録を取得しています。カメラが起動すると、QTconcurrent::run() で関数を呼び出してフレームを取得します。この関数内には、カメラ フィードがシャットダウンされたかどうかを確認する無限ループがあり、シャットダウンされた場合はループを終了します。このようなもの:
Q_FOREVER {
frame = captureFrame();
//Do stuff
//check if we must finish grabbing
if (isStopRequest() || isPauseRequest())
break;
}
ユーザーがカメラを閉じて (フレームのグラブを停止し、スレッドを終了します)、プログラムが存在する場合は、すべて問題ありません。問題は、ユーザーがカメラ フィードをオンにしたままプログラムを終了した場合です。これが発生した場合、プロセスは永久に実行し続けるか、セグメンテーション違反エラーをスローします。
ドキュメントを検索し、それに従って:
QtConcurrent::run() によって返される QFuture は、キャンセル、一時停止、または進捗レポートをサポートしていないことに注意してください。返された QFuture は、実行中/終了ステータスと関数の戻り値を照会するためにのみ使用できます。
私は、それが最善かどうかわからないこの問題の修正を思いついたので、私よりも経験豊富な人からもう少し洞察を得たいと思っています。
基本的に、次のように closeEvent を再実装しました。
void MainWindow::closeEvent(QCloseEvent *event) {
if(camera1->state() == AbstractGrabber::StoppedState)
event->accept();
else {
camera1->stop();
connect(camera1, SIGNAL(stateChanged(AbstractGrabber::State)),
SLOT(exitWindow(AbstractGrabber::State)));
event->ignore();
}
}
そしてスロットで:
void MainWindow::exitWindow(AbstractGrabber::State grabberState) {
if(grabberState == AbstractGrabber::StoppedState) this->close();
}
たぶん私は素朴ですが、これにはもっと良い解決策があるようです。経験のある人が私を助けてくれますか?
お時間をいただきありがとうございます。