Re[10]: Помогите с вопросом
От: milkpot Россия  
Дата: 21.05.24 16:31
Оценка:
Здравствуйте, Igore, Вы писали:

I>
I>class Worker2 : public QObject {
I>///...
I>public:
I>    void stopStrm()
I>    {
I>        mStop = true;
I>        QMetaObject::invokeMethod(this, "doStop", Qt::QueuedConnection);
I>    }

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


Спасибо.
На данный момент Opengl графика отображается со скоростью 32 paintGL вызовов в секунду(это взято из примера qopenglwidget).
Задача: отображать кадр со скоростью 50 вызовов в секунду

class GLWidget : public QOpenGLWidget
{
    Q_OBJECT

public:
    GLWidget(Helper *helper, QWidget *parent);

public slots:
    void animate();

protected:
    void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE;

private:
    Helper *helper;
    int elapsed;
    QTime m_time;//new
    int m_frames;//new
    QSurfaceFormat format1;
};

GLWidget::GLWidget(Helper *helper, QWidget *parent)
    : QOpenGLWidget(parent), helper(helper)
{
    elapsed = 0;
    m_frames=0;//init
   // setFixedSize(200, 200);
   // setFixedSize(320, 256);
    setFixedSize(640, 480);
    setAutoFillBackground(false);
    format1.setDepthBufferSize(32);
    format1.setStencilBufferSize(16);
    format1.setVersion(3, 2);
    format1.setSwapBehavior(QSurfaceFormat::DoubleBuffer);
    format1.setProfile(QSurfaceFormat::CoreProfile);
    setFormat(format1);
}
void GLWidget::animate()
{
    elapsed = (elapsed + qobject_cast<QTimer*>(sender())->interval()) % 1000;
    update();
}
void GLWidget::paintEvent(QPaintEvent *event)
{
    QPainter painter;
    painter.begin(this);
    painter.setRenderHint(QPainter::Antialiasing);
    helper->paint(&painter, event, elapsed);
    //--- new
    if (const int elapsed_a = m_time.elapsed()) {
        QString framesPerSecond;
        framesPerSecond.setNum(m_frames /(elapsed_a / 1000.0), 'f', 2);
        painter.setPen( Qt::white);
        painter.drawText(20, 40, framesPerSecond + " paintGL calls / s");
    }
    //---
    ;
    painter.end();
    //--- new
    if (!(m_frames % 100)) {
        m_time.start();
        m_frames = 0;
    }
    // m_fAngle += 1.0f;
    ++m_frames;
    //---
}

void Helper::paint(QPainter *painter, QPaintEvent *event, int elapsed)
{
    painter->translate(-1, 0);
    painter->drawImage(event->rect(),img2);
}


    void Worker2::setUdpData(const QByteArray& qba)
    {
        QString result;
        int block=0;
        color_shift=0;
        quint8 kadr_num=qba.at(3);
    quint16 str_num=MAKEWORD(qba.at(5),qba.at(4));//uint
    quint16 package_num=MAKEWORD(qba.at(7),qba.at(6));
        int data_quant=/*1228800*/ 307200;

        if(cnd_one)
        {
            if(package_num!=1919)
                return;
            else if(package_num==1919)
            {
                cnd_one=false;
                return;
            }
        }

        for(int i=0;i<640/4;i++)
        {
            block=8+color_shift;
                another_qba[i_counter]=qba.at( block);
                i_counter++;
                color_shift+=4;
        }
        if(i_counter==data_quant)
        {
            cnd_two=true;
            cnd_one=true;
            color_shift=0;
            prepare_generate_data();
            i_counter=0;
        }
        //    qDebug() << "i_counter" << i_counter;
        return;
    }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.