Re[4]: Помогите с вопросом
От: milkpot Россия  
Дата: 09.04.24 13:08
Оценка:
Здравствуйте, SaZ, Вы писали:



SaZ>Подожду пока вы почините отладчик и всё-таки ответите на вопрос, касательно QWaitCondition — зачем он нужен? (есть чуйка, он не нужен). И покажите как вы потоки с воркерами стартуете?


SaZ>А пока попробуйте покопать в следующую сторону: инстансы всяких стримов, включая QUdpSocket не нужно создавать в конструкторе воркера. А то получается что вы их создаёте в одном потоке, а потом начинаете использоват в другом. Он типа должно работать после moveToThread, но по факту, именно со стримами, есть платформозависимые нюансы. Вообще ничего не делайте в конструкторах воркеров.


QWaitCondition в функции doWork нужна была, потому что функция работала как аналог run'а.
Сейчас там нет QWaitCondition.

class Worker2 : public QObject
{
    Q_OBJECT
public:
    QMutex mutex;
    QWaitCondition wtc_worker;
   // QPixmap pixmap_copy;
    bool wait_cnd;
    bool b_counter;
    bool c_variable=true;
    int data_quant=81920;
    QByteArray another_qba;
    QUdpSocket *socket;
    quint16 package_num;
    quint16 str_num;
    int color_shift=0;
    int i_counter=0;
    void startStrm()
    {
        QMetaObject::invokeMethod(this, "doStart", Qt::QueuedConnection);
    }
public slots:
    void doStart()
    {
        another_qba.resize(2100000/*1228800*/);
        socket=new QUdpSocket(this);
        bool result;
        QVariant value1;
        value1=QVariant(2100000/*100000*/);
        result=socket->bind( QHostAddress::AnyIPv4, 50012);
        socket->setSocketOption(QAbstractSocket::ReceiveBufferSizeSocketOption,value1);
        value1=socket->socketOption(QAbstractSocket::ReceiveBufferSizeSocketOption);
        connect(socket, &QUdpSocket::readyRead,this,&Worker2::readPendingDatagrams);
    }

public:
    void writeToUdp(const QByteArray& qBinArray)
    {
        quint16 port_large;
        qint64 retData=0;
        QString str;

        port_large= 50012;
        retData=socket->writeDatagram(qBinArray,QHostAddress::LocalHost, port_large);
    }
public slots:
    void doWork(const QString &parameter) {
        QString result;
        bool booL_condition=true;
        b_counter=false;
        QByteArray byte_array;
        QMutexLocker locker(&mutex);

        while(booL_condition)
        {
        }
    }
    void readPendingDatagrams()
    {
        int size_of_data=0;
        qint64 ret_value=0;
        QByteArray buffer;
        QString str;
        while(socket->hasPendingDatagrams())
        {
            size_of_data=socket->pendingDatagramSize();
            if(-1==size_of_data) continue;
            buffer.resize( socket->pendingDatagramSize());
            QHostAddress sender;
            quint16 senderPort;
            ret_value=socket->readDatagram(buffer.data(),buffer.size(),&sender,&senderPort);
            if(-1==ret_value)
            {
                str=QString(tr("readDatagram failed"));
                qDebug() << str;
                continue;
            }
            writeData(buffer);
            setUdpData(buffer);
        }
    }
public:
    void setUdpData(const QByteArray& qba)
    {
        QString result;
        int block=0;
        quint8 kadr_num=qba.at(3);
    quint16 str_num=MAKEWORD(qba.at(5),qba.at(4));
    quint16 package_num=MAKEWORD(qba.at(7),qba.at(6));
        int data_quant=307200;
        for(int i=0;i<640;i++)
        {
                another_qba[i_counter]=qba.at(i+8);
                i_counter++;

        }
        if(i_counter==data_quant)
        {
            prepare_generate_data();
            i_counter=0;
        }
        return;
    }

signals:
    void resultReady(const QString &result);
    void sendData(const QImage &image);
    void writeUdpData(const QByteArray & );
};

class Window : public QWidget
{
    Q_OBJECT
private:
    Worker2 worker;
    QThread m_Thread;
};

Старт рабочей нити

Window::Window()
{
    //---+
    worker.moveToThread( &m_Thread );
    connect(&m_Thread, &QThread::finished, &worker, &QObject::deleteLater);
    connect(&worker, &Worker2::resultReady, this, &Window::appendtoLogListBox);
    connect(&worker, &Worker2::sendData, this, &Window::displayImage);
    worker.startStrm();
    m_Thread.start();
    //----
}

Window::~Window()
{
   // m_Thread.wait();
    m_Thread.quit();
}


В выводе приложения QtCreator'а после закрытия приложения появляются записи:
QThread: Destroyed while thread is still running
QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.