gpt4 book ai didi

c++ - 异步渲染到 Qt OpenGL 窗口

转载 作者:行者123 更新时间:2023-11-28 04:49:18 34 4
gpt4 key购买 nike

我正在编写一个 Windows Visual Studio 2017 C++ 程序,该程序会将采集卡中的一系列帧渲染到 Qt 5.9 OpenGL 窗口中。加载和处理图像是在线程中异步完成的,直到它停止:

void readFile(std::string filename)
{
auto reader = openreader(file);

while(!done())
{
QImage frame = reader.read();
processFrame(frame);
displayFrame(frame); /// <--- here
}

并且该线程可能被

启动
std::thread workit(readfile,"c:\funtimes.dat");

将包含像素的 QImage frame 显示到屏幕上的正确模式是什么?在 .Net 中,必须注意仅从主线程修改 gui。它如何与 Qt 一起工作?

我目前的方法是设置一个局部变量等于帧的拷贝,然后在 OpenGL QWidget 上调用 Update()。也就是说,代码 code displayFrame 看起来像:

void displayFrame(QImage frame)
{
// Mutex here
oglWindow.copyOfFrame= frame.copy();
oglWindow.update();
}

这会触发一个 paintEvent,它使用

绘制到窗口
painter.drawImage(QPoint(width()/2 - bi.width()/2, height()/2 - bi.height()/2), copyOfFrame);

当主窗口消息泵之外的线程正在触发更新或需要其他机制时,这是否安全且合适?

最佳答案

如果您的异步图像加载器是 QThread 的子类,您可以从图像加载器向主线程发出信号,QT 将确保处理代码槽在主线程中执行。参见 Qt Threads and QObjects文档

如果图像加载器不是 QThread,只是一个常规的 Win32 线程,您应该使用 QCoreApplication::PostEvent 进行线程安全传递

关于c++ - 异步渲染到 Qt OpenGL 窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48533110/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com