2016-09-07 13 views
-1

私は、信号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 
+0

あなたが実際にスロットのスコープ内からシグナルとスロットを接続したいのであれば、 'connect(thread、SIGNAL(started())、calculateManager.data()、SLOTのように' Qt :: UniqueConnection'を 'connect'に渡す必要があります。 (プロセス())、Qt :: UniqueConnection); – tobilocker

+4

http://stackoverflow.com/questions/3530590/qt-signals-and-slot-connected-twice-what-happens(duplicate?) – HazemGomaa

答えて

1

プッシュボットンスロットにすべての接続を行うのはその理由でした。したがって、接続は複数回実行されます。この一度

void MainWindow::on_pushButtonStartFFT_clicked() 
{ 
    ... 
    connect(thread, SIGNAL (started()), calculationManager.data(), SLOT (process())); 
} 

は、GUIのコンストラクタすべてに移動させたが、

+0

はい、そうです@Evgenyが前に説明した... – retinotop

4

するたびにボタンをクリックして正常に動作し、あなたが1つの接続がある最初のクリック後、

connect(thread, SIGNAL (started()), calculationManager.data(), SLOT (process())); 
connect(calculationManager.data(), SIGNAL (finished()), thread, SLOT (quit())); 
connect(calculationManager.data(), SIGNAL (finished()), this, SLOT (getResultsAndPlot())); 

だから、この接続を作成し、スロットprocess()が一度呼び出されます。 2回目のクリック後、2つの接続があり、このスロットは2回呼び出されます。等々。スロットon_pushButtonStartFFT_clicked()の外側に接続してください。

0

@Matthias Pospiechと同意します。あなたはボタンのクリックで接続を使用したい場合は、あなたが持っている1つのオプションは... http://doc.qt.io/qt-4.8/qobject.html#disconnectごとに、接続する前に、あなたの信号は、例えば...一度だけ接続されていることを確認してください。この方法は、切断を使用することです

void MainWindow::on_pushButtonStartFFT_clicked() 
{ 
... 

disconnect(thread, SIGNAL (started()), calculationManager.data(), SLOT(process())); 
connect(thread, SIGNAL (started()), calculationManager.data(), SLOT(process())); 

... 
} 
関連する問題