Files
chenzhen 222dda1e43 1,新增“App_ThermalImageSystem”;
2,新增“Apps”;
3,新增“Common”;
4,新增“FileList”;
5,新增“MediaX”;
6,新增“OpenSource”;
7,新增“Samples”;
8,新增“SoftwareBusinessLines”.
2026-02-14 23:03:23 +08:00

182 lines
3.7 KiB
C++

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <thread>
#include <chrono>
#include <mmstream.h>
#pragma comment(lib, "WinMM")
#include <QWindow>
#include <QDebug>
#define g_FrameW 1440//3840//7680
#define g_FrameH 960//2160//4320
MainWindow::MainWindow(QWidget* parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_bThreadRunning_Update = false;
m_ptrThread_Update = nullptr;
const int pixel_w = g_FrameW;
const int pixel_h = g_FrameH;
//
m_varOpenGLView.Init(eGL_ImageFormat_RGBA, pixel_w, pixel_h);
{
uint32_t hWnd = 0;
if (m_varOpenGLView.GetWndHandle(hWnd))
{
QWindow* pWindow = QWindow::fromWinId((WId)hWnd);
QWidget* pWindowContainer = QWidget::createWindowContainer(pWindow);
ui->m_GLViewLayout->addWidget(pWindowContainer);
}
}
//
m_pTestImageData = new uint8_t[pixel_w * pixel_h * 4 * 2 + 1];
for (int i = 0; i < pixel_w * pixel_h * 4 * 2; i++)
{
m_pTestImageData[i] = i % 255;
}
m_nTestImageDataIndex = 0;
//
StartThread_Update();
//
connect(&m_varTimerGL, &QTimer::timeout, this, &MainWindow::OnTimer_UpdateGL);
m_varTimerGL.setTimerType(Qt::PreciseTimer);
m_varTimerGL.start(20);
//glfwTerminate();
//exit(EXIT_SUCCESS);
/////////////////////////////////////////////////
}
MainWindow::~MainWindow()
{
disconnect(&m_varTimerGL, &QTimer::timeout, this, &MainWindow::OnTimer_UpdateGL);
StopThread_Update();
::timeEndPeriod(0);
m_varOpenGLView.Uninit();
if (nullptr != m_pTestImageData)
{
delete [] m_pTestImageData;
m_pTestImageData = nullptr;
}
delete ui;
}
void MainWindow::OnTimer_UpdateGL()
{
const int pixel_w = g_FrameW;
const int pixel_h = g_FrameH;
m_varOpenGLView.DrawImage(reinterpret_cast<char*>(&m_pTestImageData[m_nTestImageDataIndex]), pixel_w, pixel_h);
}
void MainWindow::ThreadEntry(pCallback_ThreadFun pThreadFun, void* pOwner)
{
MainWindow* pThis = reinterpret_cast<MainWindow*>(pOwner);
if (nullptr == pThis)
{
return;
}
(pThis->*pThreadFun)();
}
bool MainWindow::ThreadFun_Update()
{
const int pixel_w = g_FrameW;
const int pixel_h = g_FrameH;
uint64_t szCounter[100];
memset(szCounter, 0, sizeof(szCounter));
int nIndex = 0;
int nCounter = 0;
while (m_bThreadRunning_Update)
{
nIndex += pixel_w * 4;
if (nIndex >= pixel_w * pixel_h * 4)
{
nIndex = 0;
}
m_nTestImageDataIndex = nIndex;
memcpy(&szCounter[0], &szCounter[1], 99 * sizeof(uint64_t));
szCounter[99] = std::chrono::high_resolution_clock::now().time_since_epoch().count();
nCounter++;
if (nCounter >= 120)
{
nCounter = 0;
double dSpan = double(szCounter[99] - szCounter[0]);
double dFPS = 100.0 / (dSpan / 1000000000.0);
qDebug("dSpan : %f, fps: %f", dSpan, dFPS);
int jj = 0;
}
std::this_thread::sleep_for(std::chrono::microseconds(10 * 1000)); // 100FPS
}
return true;
}
bool MainWindow::StartThread_Update()
{
StopThread_Update();
//
m_bThreadRunning_Update = true;
m_ptrThread_Update = new std::thread(std::bind(&MainWindow::ThreadEntry, &MainWindow::ThreadFun_Update, (void*)this));
return true;
}
void MainWindow::StopThread_Update()
{
//
if (m_bThreadRunning_Update)
{
m_bThreadRunning_Update = false;
if (nullptr != m_ptrThread_Update)
{
m_ptrThread_Update->join();
delete m_ptrThread_Update;
m_ptrThread_Update = nullptr;
}
}
}