6

関連する QFuture オブジェクトによって Thread を停止することは可能ですか? 現在、私はこのようなビデオキャプチャプロセスを開始しています。

this->cameraThreadRepresentation = QtConcurrent::run(this,&MainWindow::startLiveCapturing);

startLiveCapturing-Method 内では、画像をキャプチャして表示する無限ループが実行されています。そのため、ユーザーがそのプロセスを停止したい場合は、ボタンを押すだけで操作が停止します。しかし、このようにキャンセルメソッドを呼び出してこのスレッドを停止することはできないようです?

this->cameraThreadRepresentation.cancel();

私が間違っていることと、そのスレッドまたは操作を停止するにはどうすればよいですか。

4

3 に答える 3

8

QtConcurrent::runのドキュメントから:

QtConcurrent::run() によって返される QFuture は、キャンセル、一時停止、または進捗レポートをサポートしていないことに注意してください。返された QFuture は、実行中/終了ステータスと関数の戻り値を照会するためにのみ使用できます。

あなたができることは、ボタンを押してメインウィンドウにブールフラグを設定し、次のように無限ループを構築することです:

_aborted = false;

forever    // Qt syntax for "while( 1 )"
{
    if( _aborted ) return;

    // do your actual work here
}
于 2013-09-17T09:13:48.817 に答える
2

キャプチャ ループ内でテストできるブール フラグを作成してみませんか。設定すると、ジャンプしてスレッドが終了します。

何かのようなもの:

MainWindow::onCancelClick() // a slot
{
    QMutexLocker locker(&cancelMutex);
    stopCapturing = true;
}

そして、スレッド関数の場合:

MainWindow::startLiveCapturing()
{
   forever
   {

       ...
       QMutexLocker locker(&cancelMutex);
       if (stopCapturing) break;
   }

}
于 2013-09-17T09:18:24.223 に答える