Здравствуйте, 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 то до бесконечности.