Поток не запущен в наследуемом классе - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть приложение, чтобы получить значение другого протокола последовательного 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 () в этом случае.

...