Вызывающий слот в другом потоке не вызывается - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть класс с последовательным интерфейсом, который передает некоторые данные и emit a MessageReceived сигнал при получении некоторых действительных данных:

Последовательный. c

void Serial::on_serialPort_readData()
{
        ... Other stuff...

        else
        {
            qDebug() << "Received in serial";
            emit MessageReceived(_mReceivedData);
        }
    }
}

И у меня есть главное окно, которое открывает последовательное соединение и запускает транзакцию сообщения. Но мне нужно получить много данных, и передача займет некоторое время, поэтому я решил использовать QThread для обработки полученных данных.

Я создал поток и рабочий в моем mainwindow.cpp (код от здесь ):

основное окно. cpp

_mThread = new QThread(this);
_mThreadWorker = new Worker();
_mThreadWorker->moveToThread(_mThread);

// Like in the example
connect(_mThread, &QThread::started, _mThreadWorker, &Worker::Progress);
connect(_mThreadWorker, &Worker::Finished, _mThread, &QThread::quit);
connect(_mThreadWorker, &Worker::Finished, _mThreadWorker, &Worker::deleteLater);
connect(_mThread, &QThread::finished, _mThread, &QObject::deleteLater);

connect(_mProtocolInterface, &Serial::MessageReceived, _mThreadWorker, &Worker::UpdateData);

_mThread->start();

// Send the first packet so the receiver will answer

Последовательный интерфейс будет отправлять данные в разных пакетах и я прочитал здесь , что плохая идея использовать последовательный порт в отдельном потоке, поэтому я решил использовать последовательный порт в главном потоке и соединить сигнал MessageReceived с UpdateData слот моего работника:

работник.ч

class Worker : public QObject
{
    Q_OBJECT

    ...

    public slots:
        void Progress(void);
        void UpdateData(QByteArray Data);

    public:
        Worker(QObject* parent = nullptr);
        ~Worker();
        ...
};

работник. cpp

void Worker::UpdateData(QByteArray Data)
{
    qDebug() << "Received in Worker";
    _mData = Data;
}

void Worker::Progress(void)
{
    while(_mActive)
    {
        switch(_mState)
        {
            case STATE_INIT:
            {
                _mState = STATE_INIT;
                // Just a idle to simulate the data transfer during debugging
                break;
            }
        }
    }
}

Но после получения данных от получателя вызывается только слот on_serialPort_readData:

>> Received in serial

Так почему не вызывается слот UpdateData класса Worker?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...