私は、信号finished()を発行するパブリックスロットプロセス()を持つCalculationManagerクラスを作成しました。2回以上呼ばれたスレッドからのQtスロット
void CalculationManager::process()
{
cout << "calc FFT: process()" << endl;
...
emit finished();
}
これは関数であり、GUIの起動時
void MainWindow::getResultsAndPlot()
{
fftAction doShift = static_cast<fftAction>(calculationManager->shiftBeforeFFT());
updatePlotData(ui->qplot1, calculationManager->data(doShift));
cout << "update plots" << endl;
}
プロットのスロットをGUIからQThread(calculationManagerがQScopedPointerある)
void MainWindow::on_pushButtonStartFFT_clicked()
{
cout << "on_pushButtonStartFFT_clicked()" << endl;
...
calculationManager->moveToThread(thread);
connect(thread, SIGNAL (started()), calculationManager.data(), SLOT (process()));
connect(calculationManager.data(), SIGNAL (finished()), thread, SLOT (quit()));
connect(calculationManager.data(), SIGNAL (finished()), this, SLOT (getResultsAndPlot()));
cout << "FFT thread started." << endl;
thread->start();
}
で使用されと呼ばれる。出力は予想通りである:
on_pushButtonStartFFT_clicked()
FFT thread started.
calc FFT: process()
update plots
しかし、ボタンの呼び出し上のすべてのさらにクリックすると、さらに多くの場合、getResultsAndPlot()を複数回処理し。私はなぜこれが起こるのか分からない。どのように私はこれをデバッグすることができますか?
on_pushButtonStartFFT_clicked()
FFT thread started.
calc FFT: process()
calc FFT: process()
update plots
update plots
update plots
update plots
on_pushButtonStartFFT_clicked()
FFT thread started.
calc FFT: process()
calc FFT: process()
calc FFT: process()
update plots
update plots
update plots
update plots
update plots
update plots
update plots
update plots
update plots
あなたが実際にスロットのスコープ内からシグナルとスロットを接続したいのであれば、 'connect(thread、SIGNAL(started())、calculateManager.data()、SLOTのように' Qt :: UniqueConnection'を 'connect'に渡す必要があります。 (プロセス())、Qt :: UniqueConnection); – tobilocker
http://stackoverflow.com/questions/3530590/qt-signals-and-slot-connected-twice-what-happens(duplicate?) – HazemGomaa