Информация об изменениях

Сообщение Re[6]: вопрос от 24.03.2022 15:56

Изменено 25.03.2022 14:09 milkpot

Re[6]: вопрос
Здравствуйте, Zhendos, Вы писали:

Z>Здравствуйте, milkpot, Вы писали:


M>>Здравствуйте, Zhendos, Вы писали:



M>>Вот фрагмент кода с изменениями


M>>
M>>class Worker : public QObject
M>>    void prepare_generate_data()
M>>    {
M>>        QString str;
M>>       // str.append(" --- slot button6Clicked() ");
M>>       // appendtoLogListBox(str);
M>>        QString filePath;
M>>        QFile file;
M>>        QDataStream dstrm;
M>>        int data_quant=0;
M>>        std::vector<unsigned short> buffer_vect;
M>>        QSize rct_size(320,256);

M>>        QPixmap myPixmap;
M>>


Z>Вообще с QPixmap не совсем безопасно работать не из главного потока,

Z>но возможно на вашей платформе все хорошо, вот фрагмент когда самого Qt:
Z>
Z> if (qApp->thread() != QThread::currentThread()) {
Z>        bool fail = false;
Z>        if (!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::ThreadedPixmaps)) {
Z>            printf("Platform plugin does not support threaded pixmaps!\n");
Z>            fail = true;
Z>        }
Z>        if (fail) {
Z>            qWarning("QPixmap: It is not safe to use pixmaps outside the GUI thread");
Z>            return false;
Z>        }
Z>    }
Z>


Z>Более надежно было бы если бы вспомогательный поток предедавал бы QImage в главный,

Z>а уже тот (если нужно) делал из него QPixmap.
Z>Ну теперь осталось в главном потоке сделать ограничение на FPS и все,
Z>что-нибудь типа:
Z>
Z>void onNewData() {
Z>  if (delayedTimer->isActive()) {
Z>     return;
Z>  }
Z>  delayedTimer->start(std::milliseconds(100));
Z>}
Z>


Вот исправленный код:

    void prepare_generate_data()
    {
        QString str;
       // str.append(" --- slot button6Clicked() ");
       // appendtoLogListBox(str);
        QString filePath;
        QFile file;
        QDataStream dstrm;
        int data_quant=0;
        std::vector<unsigned short> buffer_vect;
        QSize rct_size(320,256);

       // QPixmap myPixmap;

        QImage loc_img(rct_size,QImage::Format_RGB32 /*QImage::Format_RGBX8888*/);

        QRgb *line;

       // pixmap_vect.clear();

        QBuffer hr;

        unsigned long/* long */ start_time=GetTickCount();
        for(int k=0;k<5;k++)
        for(int i=0;i<256;i++)
        {
            for(int y=0;y<loc_img.height();y++)
            {
               // QRgb *line=reinterpret_cast<QRgb*>(loc_img.scanLine(y));
                line=static_cast<QRgb *>(static_cast<void *>(loc_img.scanLine(y)));
                for(int x=0;x<loc_img.width();x++)
                {
                    if(x<256-i)
                        line[x]=qRgb(x,x,x);
                    else
                        line[x]=qRgb(0x80,0x80,0x80);
                }
            }
           // pixmap_copy=QPixmap::fromImage( loc_img);
            if(b_counter==false)
            {
                b_counter=true;
            }
            else
            {
               //
               // ::Sleep(1);
            }
            ;
            emit sendData(loc_img/*pixmap_copy*/);
        }

        unsigned long/* long */ end_time=GetTickCount();
        unsigned long/* long */ loc_delta=end_time-start_time;
         str=QString(tr("  --- loc_delta = %1")).arg(loc_delta);
         do_send_result(str);
       // loc_list.clear();
        return;
    }



class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    Controller *cntrl;
    QTimer *timer;
...
};

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    QString str;
    counter=0;
    counter_img=0;
    str.append(" --- Worker");
    cntrl=new Controller();
    if(nullptr!=cntrl)
    {
        cntrl->do_start(str);
       // b_blocking_res_value=false;
    }

    connect(this->cntrl,&Controller::writeResults,this,&MainWindow::appendtoLogListBox);
    connect(this->cntrl,&Controller::writePicture,this,&MainWindow::displayImage,Qt::QueuedConnection);
    timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(update()));
    initializeGL();
}

void MainWindow::displayImage(const QImage &image_data)
{
    QString str;
//    if (timer->isActive()) {
//       return;
//    }
    timer->start(100);
    counter_img++;
    if(counter_img==1)
        (0);
    else {
        pScene->removeItem(graphicspixmapItem);
        delete graphicspixmapItem;
    }
    pixmap_copy=QPixmap::fromImage( image_data/*loc_img*/);
    graphicspixmapItem=pScene->addPixmap(pixmap_copy/*pixmap_data*/);

}
Re[6]: вопрос
Здравствуйте, Zhendos, Вы писали:

Z>Здравствуйте, milkpot, Вы писали:


M>>Здравствуйте, Zhendos, Вы писали:



M>>Вот фрагмент кода с изменениями


M>>
M>>class Worker : public QObject
M>>    void prepare_generate_data()
M>>    {
M>>        QString str;
M>>       // str.append(" --- slot button6Clicked() ");
M>>       // appendtoLogListBox(str);
M>>        QString filePath;
M>>        QFile file;
M>>        QDataStream dstrm;
M>>        int data_quant=0;
M>>        std::vector<unsigned short> buffer_vect;
M>>        QSize rct_size(320,256);

M>>        QPixmap myPixmap;
M>>


Z>Вообще с QPixmap не совсем безопасно работать не из главного потока,

Z>но возможно на вашей платформе все хорошо, вот фрагмент когда самого Qt:
Z>
Z> if (qApp->thread() != QThread::currentThread()) {
Z>        bool fail = false;
Z>        if (!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::ThreadedPixmaps)) {
Z>            printf("Platform plugin does not support threaded pixmaps!\n");
Z>            fail = true;
Z>        }
Z>        if (fail) {
Z>            qWarning("QPixmap: It is not safe to use pixmaps outside the GUI thread");
Z>            return false;
Z>        }
Z>    }
Z>


Z>Более надежно было бы если бы вспомогательный поток предедавал бы QImage в главный,

Z>а уже тот (если нужно) делал из него QPixmap.
Z>Ну теперь осталось в главном потоке сделать ограничение на FPS и все,
Z>что-нибудь типа:
Z>
Z>void onNewData() {
Z>  if (delayedTimer->isActive()) {
Z>     return;
Z>  }
Z>  delayedTimer->start(std::milliseconds(100));
Z>}
Z>


Вот исправленный код:

    void prepare_generate_data()
    {
        QString str;
       // str.append(" --- slot button6Clicked() ");
       // appendtoLogListBox(str);
        QString filePath;
        QFile file;
        QDataStream dstrm;
        int data_quant=0;
        std::vector<unsigned short> buffer_vect;
        QSize rct_size(320,256);

       // QPixmap myPixmap;

        QImage loc_img(rct_size,QImage::Format_RGB32 /*QImage::Format_RGBX8888*/);

        QRgb *line;

       // pixmap_vect.clear();

        QBuffer hr;

        unsigned long/* long */ start_time=GetTickCount();
        for(int k=0;k<5;k++)
        for(int i=0;i<256;i++)
        {
            for(int y=0;y<loc_img.height();y++)
            {
               // QRgb *line=reinterpret_cast<QRgb*>(loc_img.scanLine(y));
                line=static_cast<QRgb *>(static_cast<void *>(loc_img.scanLine(y)));
                for(int x=0;x<loc_img.width();x++)
                {
                    if(x<256-i)
                        line[x]=qRgb(x,x,x);
                    else
                        line[x]=qRgb(0x80,0x80,0x80);
                }
            }
           // pixmap_copy=QPixmap::fromImage( loc_img);
            if(b_counter==false)
            {
                b_counter=true;
            }
            else
            {
               //
               // ::Sleep(1);
            }
            ;
            emit sendData(loc_img/*pixmap_copy*/);
        }

        unsigned long/* long */ end_time=GetTickCount();
        unsigned long/* long */ loc_delta=end_time-start_time;
         str=QString(tr("  --- loc_delta = %1")).arg(loc_delta);
         do_send_result(str);
       // loc_list.clear();
        return;
    }



class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    Controller *cntrl;
    QTimer *timer;
...
};

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    QString str;
    counter=0;
    counter_img=0;
    str.append(" --- Worker");
    cntrl=new Controller();
    if(nullptr!=cntrl)
    {
        cntrl->do_start(str);
       // b_blocking_res_value=false;
    }

    connect(this->cntrl,&Controller::writeResults,this,&MainWindow::appendtoLogListBox);
    connect(this->cntrl,&Controller::writePicture,this,&MainWindow::displayImage,Qt::QueuedConnection);
    timer = new QTimer(this);
   // connect(timer, SIGNAL(timeout()), this, SLOT(update()));
    connect(timer, SIGNAL(timeout()), this, SLOT(printData()));
    initializeGL();
}

void MainWindow::displayImage(const QImage &image_data)
{
    QString str;
    counter_img++;
    if(counter_img==1)
        (0);
    else {
        pScene->removeItem(graphicspixmapItem);
        delete graphicspixmapItem;
    }
    pixmap_copy=QPixmap::fromImage( image_data/*loc_img*/);
    graphicspixmapItem=pScene->addPixmap(pixmap_copy/*pixmap_data*/);
    //---
        if (timer->isActive()) {
          return;
        }
        timer->start(100);

}
void MainWindow::printData()
{
    QString str;
    str=QString(tr("  --- printData"));
    appendtoLogListBox(str);
    timer->stop();
    return;
}