异步渲染到Qt-OpenGL窗口 我正在编写一个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 }
要将包含像素的QImage帧显示在屏幕上,正确的模式是什么?在.Net中,必须注意仅从主线程修改gui。Qt是如何工作的 当前的方法是将局部变量设置为等于帧的副本,然后在OpenGL QWidget上调用Update。也就是说,代码显示框看起来像:异步渲染到Qt-OpenGL窗口 我正在编写一个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 },c++,multithreading,qt,opengl,C++,Multithreading,Qt,Opengl,要将包含像素的QImage帧显示在屏幕上,正确的模式是什么?在.Net中,必须注意仅从主线程修改gui。Qt是如何工作的 当前的方法是将局部变量设置为等于帧的副本,然后在OpenGL QWidget上调用Update。也就是说,代码显示框看起来像: void displayFrame(QImage frame) { // Mutex here oglWindow.copyOfFrame= frame.copy(); oglWindow.update(); } 这将触发绘制到
void displayFrame(QImage frame)
{
// Mutex here
oglWindow.copyOfFrame= frame.copy();
oglWindow.update();
}
这将触发绘制到具有
painter.drawImage(QPoint(width()/2 - bi.width()/2, height()/2 - bi.height()/2), copyOfFrame);
当主窗口消息泵外的线程触发更新或需要其他机制时,这是否安全且合适?如果异步映像加载程序是QThread的子类,则可以从映像加载程序向主线程发送信号,QT将确保在主线程中执行处理代码槽。请参阅Qt文档 如果映像加载程序不是QThread,只是一个普通的Win32线程,那么应该使用QCoreApplication::PostEvent进行线程安全传递
painter.drawImage(QPoint(width()/2 - bi.width()/2, height()/2 - bi.height()/2), copyOfFrame);