Здравствуйте, milkpot, Вы писали:
Не понимание времени жизни объектов
1) Если нет new не нужно deleteLater, ну или delete, это двойное удаление, то что на стэке само удалится
2) Если Qt объекту передали родителя, то при уничтожении родителя он удаляет своих детей. Поэтому тут тоже двойное удаление
m_pSocket.reset( new QUdpSocket(this) );
а) Удаляется по this
б) Удаляется при уничтожении QScopedPointer
M>//----
M>M>private:
M> Worker2 worker;
M> QThread m_Thread;
M> Worker3 worker3;
M> QThread m_Thread3;
M>};
M>Window::Window()
M>{
M> connect(&m_Thread, &QThread::finished, &worker, &QObject::deleteLater);
M> connect(&m_Thread3, &QThread::finished, &worker3, &QObject::deleteLater);
// не нужно так как на стэке worker, m_Thread, worker3, m_Thread3 удалятся сами после деструктора ~Window
M>}
M>Window::~Window()
M>{
M> worker.stopStrm();
M> m_Thread.quit();
M> b_result=m_Thread.wait(200);
//При waitForFinished зависает?
M>}
M>void Window::displayImage(const QImage& img)
M>{
M> helper.img2=img;
M> update();
M>}
M>void Window::launchWrite()
M>{
M> QByteArray byte_array;
M> worker3.writeToUdp3(byte_array);// Выводится сообщение в консоль QtCreator:
M>//QObject: Cannot create children for a parent that is in a different thread.
M>//(Parent is QUdpSocket(0x1e03938), parent's thread is QThread(0x61fdc4), current thread is QThread(0x1692d80)
M>//Или надо делать вызов через signal-slot?
M>//Если убрать Worker3 и реализовать через Worker2, то сообщение не появляется
M>
worker3.writeToUdp3 это вызов метода напрямую из UI потока, при этом и worker3 и m_pSocket3 в другом потоке/
Поэтому
вариант 1: убирай поток,
вариант 2: делай signal из Window и connect на Worker
class Window
signal:
void writeToUdp(QByteArray)
Window::Window() {
connect(this, &Window::writeToUdp, &worker2, &Worker2::writeToUdp3);
void Window::launchWrite() {
//...
emit writeToUdp(byte_array);
}
class Worker3 : public QObject {
public slots:
void writeToUdp3(const QByteArray& qBinArray)
вариант 3:
через очередь потока
class Worker3 : public QObject {
public:
void writeToUdp3(const QByteArray& qBinArray)
{
// не помню как аргументы передавать, псевдокод
QMetaObject::invokeMethod(this, "doWriteToUdp3", Q_ARG(qBinArray), Qt::QueuedConnection);
}
public:
void doWriteToUdp3(const QByteArray& qBinArray)
M>M>class Worker2 : public QObject
M>{
M> QScopedPointer<QUdpSocket> m_pSocket;
M> void doStart()
M> {
M> m_pSocket.reset( new QUdpSocket(this) );
//Не нужно this передавать
M>//--- Вводим класс Worker3, чтобы производить запись датаграмм в сокет
M>class Worker3 : public QObject
M>{
M>public slots:
M> void doStart3()
M> {
M> m_pSocket3.reset( new QUdpSocket(this) );
//Не нужно this передавать
M> }
M>