Информация об изменениях

Сообщение Re[9]: Помогите с вопросом от 28.04.2024 10:33

Изменено 01.05.2024 7:30 Igore

Re[9]: Помогите с вопросом
Здравствуйте, milkpot, Вы писали:

M>m_Thread.wait(200) = false

M>m_Thread3.wait(200) = true
А это требования что при закрытии есть только 200мс на остановку?
M>QThread: Destroyed while thread is still running
M>QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread
M>QSocketNotifier: Multiple socket notifiers for same socket 1032 and type Read
M>QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread
M>QSocketNotifier: Multiple socket notifiers for same socket 1032 and type Read
M>QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread
M>QUdpSocket::hasPendingDatagrams() called on a QUdpSocket when not in QUdpSocket::BoundState
Собственно все тоже самое что до этого, за 200мс не успели остановиться, после начинается уничтожение объектов в том состоянии в котором они находятся(поток работает, сокет в этом работающем потоке), ну и вот такие ошибки

M>Если сначала отключить устройство, то в окно вывода приложения выводятся только

M>m_Thread.wait(200) = true
M>m_Thread3.wait(200) = true
Тут успели остановиться за 200мс всё хорошо.

Ну если это прям требования, что так мало времени есть на остановку, то вводи дополнительно ручную синхронизацию.
Сейчас ситуация, в очереди потока есть слоты которые должны отработать, последовательно, и дойти очередь до слота остановки. Обработку при остановке надо ускорить. Грубо
class Worker2 : public QObject {
///...
public:
    void stopStrm()
    {
        mStop = true;
        QMetaObject::invokeMethod(this, "doStop", Qt::QueuedConnection);
    }

    void readPendingDatagrams()
    {
        QByteArray buffer;
        while(m_pSocket->hasPendingDatagrams() && !mStop)
        ///...
    }
private:
   std::atomic<bool> mStop = {false};
}

Ну или увеличить время ожидания остановки 200 как то маловато, если waitForFinished то до бесконечности.
Re[9]: Помогите с вопросом
Здравствуйте, milkpot, Вы писали:

M>m_Thread.wait(200) = false

M>m_Thread3.wait(200) = true
А это требования что при закрытии есть только 200мс на остановку?
M>QThread: Destroyed while thread is still running
M>QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread
M>QSocketNotifier: Multiple socket notifiers for same socket 1032 and type Read
M>QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread
M>QSocketNotifier: Multiple socket notifiers for same socket 1032 and type Read
M>QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread
M>QUdpSocket::hasPendingDatagrams() called on a QUdpSocket when not in QUdpSocket::BoundState
Собственно все тоже самое что до этого, за 200мс не успели остановиться, после начинается уничтожение объектов в том состоянии в котором они находятся(поток работает, сокет в этом работающем потоке), ну и вот такие ошибки

M>Если сначала отключить устройство, то в окно вывода приложения выводятся только

M>m_Thread.wait(200) = true
M>m_Thread3.wait(200) = true
Тут успели остановиться за 200мс всё хорошо.

Ну если это прям требования, что так мало времени есть на остановку, то вводи дополнительно ручную синхронизацию.
Сейчас ситуация, в очереди потока есть слоты которые должны отработать, последовательно, и дойти очередь до слота остановки(или readPendingDatagrams просто не заканчивается так как слишком много данных шлется). Обработку при остановке надо ускорить. Грубо
class Worker2 : public QObject {
///...
public:
    void stopStrm()
    {
        mStop = true;
        QMetaObject::invokeMethod(this, "doStop", Qt::QueuedConnection);
    }

    void readPendingDatagrams()
    {
        QByteArray buffer;
        while(m_pSocket->hasPendingDatagrams() && !mStop)
        ///...
    }
private:
   std::atomic<bool> mStop = {false};
}

Ну или увеличить время ожидания остановки 200 как то маловато, если waitForFinished то до бесконечности.