QObject :: connect завершается неудачно во время выполнения, в то время как связывает сигнал завершения потока с delateLater-slot маппера - PullRequest
0 голосов
/ 17 марта 2020

Я использую C ++ и Qt4.5.2 (требование целевой системы) в моем проекте. Существует потребность в рабочем потоке, снабженном дополнительными аргументами / параметром, поэтому я сделал следующее (короче говоря, удаленную обработку ошибок / вывод):

bool _bRetVal = false;
COpgThread* _pParseThread = new COpgThread(); // COpgThread is subclassed from QThread to access the protected msleep-function
COpgWorker* _pParseWorker = new COpgWorker(); // COpgWorker is subclassed from QObject to provide: slots (process) and signals (finished, progress, error) for a COpgThread-instance
QSignalMapper* _pParseMapper = new QSignalMapper();
COpgParam _pParseParam = new COpgParam(m_sParseFile, m_sRegExpFile); // COpgParam is subclassed from QObject to handle user data for mapping

_pParseWorker->moveToThread(_pParseThread);
//#1 hookup error-signal from worker to errorParsing-function in this object
_bRetVal = QObject::connect(_pParseWorker, SIGNAL(error(int const)), this, SLOT(errorParsing(int const)));

//#2..3 hookup thread's started-signal to process-slot in the worker (via signal mapper for parameters/arguments)
_bRetVal = QObject::connect(_pParseThread, SIGNAL(started()), _pParseMapper, SLOT(map()));
_pParseMapper->setMapping(_pParseThread, _pParseParam);
_bRetVal = QObject::connect(_pParseMapper, SIGNAL(mapped(QObject*)), _pParseWorker, SLOT(process(QObject*)));

//#4 hookup progress-signal from worker to progessParsing-function in this object    
_bRetVal = QObject::connect(_pParseWorker, SIGNAL(progress(int const)), this, SLOT(progressParsing(int const)));

//#5 hookup finished-signal from worker to completedParsing-function in this object
_bRetVal = QObject::connect(_pParseWorker, SIGNAL(finished(int const)), this, SLOT(completedParsing(int const)));

//#6 when worker emits finished-signal, signal thread to quit (shutdown)
_bRetVal = QObject::connect(_pParseWorker, SIGNAL(finished(int const)), _pParseThread, SLOT(quit()));
//#7 when worker emits finished-signal, mark worker to be deleted
_bRetVal = QObject::connect(_pParseWorker, SIGNAL(finished(int const)), _pParseWorker, SLOT(deleteLater()));
//++++ this connect fails at runtime ++++
    //#8 when thread emits finished-signal, mark mapper to be deleted
    _bRetVal = QObject::connect(_pParseThread, SIGNAL(finished(int const)), _pParseMapper, SLOT(deleteLater()));
//+++++++++++++++++++++++++++++++++++++++
//#9 when thread emits finished-signal, mark thread to be deleted
_bRetVal = QObject::connect(_pParseThread, SIGNAL(finished(int const)), _pParseThread, SLOT(deleteLater()));
_pParseThread->start();

Весь код компилируется без каких-либо ошибок, но Восьмое соединение не удается во время выполнения. Я думал, что когда я создаю экземпляр QSignalMapper ... он должен быть удален когда-нибудь. Может быть, это потраченный впустую код. Я не очень знаком с Qt.

Есть предложения?

Заранее спасибо.

1 Ответ

0 голосов
/ 17 марта 2020

, но восьмое соединение завершается неудачно во время выполнения.

На стандартный вывод выводится сообщение об ошибке - что он печатает?

Кстати: QProcess :: закончено ( ) сигнал является СИГНАЛОМ (закончено (int)) - это может быть вашей проблемой.

...