У меня есть приложение, чтобы получить значение другого протокола последовательного Ethernet .....
У меня есть список протокола, у меня есть члены qThread.
В этом потоке у меня есть локальный объект serial, ethernet, объект связи находится в потоке.
бывший класс: serialThread
serialThread::serialThread(Protocole *Parent): ThreadProt( this, Parent )
{
qDebug() << "new serial thread:" << this;
setParent(Parent); //parent = protocole
}
запуск реализован здесь
void serialThread::run()
{
qDebug() << "thread serial:" << QThread::currentThreadId();
serial l_serial(this,m_prot);
exec();
}
класс ThreadProt: общедоступный QThread
я создал threadProt для группировки кода для другого протокола.
уничтожение потока, уничтожение родителя с помощью deleteLater (serialThread)
сигналы для потока
доступ к объекту локально в потоке run ()
ThreadProt::ThreadProt(QObject*pParent,Protocole* pProt)
{
qDebug() << "new threadProt:" << this;
setParent(pParent); //serialthread Modbus thread
m_prot = pProt;
m_o_thread = NULL;
connect(this, SIGNAL(finished()) ,pParent , SLOT(deleteLater()) );
//qthread fini on détruit le parent
start();
}
иногда поток не запускается (), не выполняется run () в последовательном потоке.
почему не решение наследовать qthread ???
я перезапустил свой код с этой структурой.
Я предпочитаю не использовать перемещение в нить и мой объект в локальном потоке.
Я думаю, что лучше, но этот дизайн не работает нормально, если у вас есть класс Intermediaire
хорошо, я не знаю, должен ли threadProt использовать setParent.
поток запускается startProt () с вызовом в Q_INVOKABLE функции dashBoardStart () в QML.
void App::dashBoardStart()
{
quint32 l_prot;
qDebug() << "start dashboard" << LstProt.length();
if (LstProt.count() ==0)
return;
for (l_prot=0;l_prot < LstProt.count();l_prot++)
{
Protocole* l_pt = LstProt[l_prot].value<Protocole*>();
if (m_lst_prot_ready)
m_lst_prot_ready->append(false);
l_pt->startProt();
}//Finsi
}
bool Protocole::startProt()
{
//allocation du thread serial
if (m_liaison.ConfigRs == NULL)
m_liaison.ConfigRs = new serialThread(this);
return (l_ret);
}
есть идеи, потому что поток не запускается, если вызывается в классе наследования?
thread isRunning = true isStarted - это вызов, но не вызов run () в этом случае.