Сообщение 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мс всё хорошо.
Ну если это прям требования, что так мало времени есть на остановку, то вводи дополнительно ручную синхронизацию.
Сейчас ситуация, в очереди потока есть слоты которые должны отработать, последовательно, и дойти очередь до слота остановки. Обработку при остановке надо ускорить. Грубо
Ну или увеличить время ожидания остановки 200 как то маловато, если waitForFinished то до бесконечности.
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 просто не заканчивается так как слишком много данных шлется). Обработку при остановке надо ускорить. Грубо
Ну или увеличить время ожидания остановки 200 как то маловато, если waitForFinished то до бесконечности.
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 то до бесконечности.