Сообщение Re[6]: вопрос от 24.03.2022 15:56
Изменено 25.03.2022 14:09 milkpot
Re[6]: вопрос
Здравствуйте, Zhendos, Вы писали:
Z>Здравствуйте, milkpot, Вы писали:
M>>Здравствуйте, Zhendos, Вы писали:
M>>Вот фрагмент кода с изменениями
M>>
Z>Вообще с QPixmap не совсем безопасно работать не из главного потока,
Z>но возможно на вашей платформе все хорошо, вот фрагмент когда самого Qt:
Z>
Z>Более надежно было бы если бы вспомогательный поток предедавал бы QImage в главный,
Z>а уже тот (если нужно) делал из него QPixmap.
Z>Ну теперь осталось в главном потоке сделать ограничение на FPS и все,
Z>что-нибудь типа:
Z>
Вот исправленный код:
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>>
Z>Вообще с QPixmap не совсем безопасно работать не из главного потока,
Z>но возможно на вашей платформе все хорошо, вот фрагмент когда самого Qt:
Z>
Z>Более надежно было бы если бы вспомогательный поток предедавал бы QImage в главный,
Z>а уже тот (если нужно) делал из него QPixmap.
Z>Ну теперь осталось в главном потоке сделать ограничение на FPS и все,
Z>что-нибудь типа:
Z>
Вот исправленный код:
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;
}