[英]Asynchronous Rendering to Qt OpenGL Window
我正在编写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()
。 也就是说,代码代码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 线程和QObjects文档
如果图像加载器不是QThread,而只是常规Win32线程,则应使用QCoreApplication :: PostEvent进行线程安全传递
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.