생산자 개체가 처리하는 일부 HW의 실시간 데이터 스트림이 있습니다. 이것은 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()를 사용할 수 없습니다. –
나는 사용자의 뜻을 이해하지 못합니다. 소비자 스레드가 QAbstractSocket :: waitFor *에서 차단 되었습니까? – cgmb
deleteLater와 QTimer에 대한 경고를 받았는데, 스레드가 명시적인 타이머를 사용하고 있지 않기 때문에 소켓이 연결되어 있어야합니다. –