我有一個由生產者對象處理的一些硬件的實時數據流。 這會連接到一個消費者,它在它自己的線程中處理它,以保持gui的響應。插槽斷開後的Qt信號
mainwindow::startProcessing(){
QObject::connect(producer,SIGNAL(dataReady(data*),consumer,SLOT(doData(data*)));
consumer->moveToThread(&consumerThread);
consumerThread.start();
}
mainwindow::stopProcessing(){
producer->disconnect(SIGNAL(dataReady(data*));
consumer->cleanup();
delete consumer;
}
consumer::doData(data* x) {
mutex.lock();
processingObject stuff
mutex.unlock()
}
consumer::cleanup() {
mutex.tryLock();
.... blah ....
delete processingObject; // then doData gets called again
}
我的問題是,我銷燬消費者對象後 - 即使在斷開連接後,我仍然會收到張貼的信號。我嘗試了一組越來越複雜的互斥體來試圖阻止這一點,但理想的解決方案是清理等待所有未完成信號的處理。
有無論如何監測有多少未處理的信號排隊等待一個插槽?或者無論如何清除它們?
Unfortunatley的處理涉及一個TCPSocket,它有一個計時器,你不能在定時器中等待的線程上使用deleteLater() – 2012-08-02 14:52:37
我不太明白你的意思。消費者線程是否在QAbstractSocket :: waitFor *上被阻塞? – cgmb 2012-08-02 19:56:05
我得到了一個有關deleteLater和QTimer的警告,他是否連接了socket,我認爲它必須是TCP套接字,因爲線程中沒有使用明確的定時器。 – 2012-08-02 21:07:36