多线程opengl 创建位图失败之解决方案
2010年07月08日
多线程opengl 创建位图失败之解决方案
最近一直在做opengl多线程,遇到的问题是:在多线程中使用opengl的glGenTextures来画位图时无效果,在网上搜索了三天,问了好多网友和技术群,都无一例外的没有得到答案。
终于昨天在网上搜索时找到了相关的信息,解决方案如下,如你也遇到这个问题,希望我能提供给你帮助。
转载自:http://zhidao.baidu.com/question/77393242.html
你在你的分线程里调用
wglMakeCurrent来把HDC和当前可用的HGLRC连接起来,记住,OPENGL的HGLRC同一时间只能在一个线程内使用,也就是说它是线程安全的,当然你这个线程结束前必须调用wglMakeCurrent (NULL, NULL)
如果在你的版本中这样做也不成功的话
建议你在进入线程的时候用
wglCreateContext (hdc);
wglMakeCurrent (hdc, hglrc);
线程退出前用
wglMakeCurrent (NULL, NULL) ;
wglDeleteContext (hglrc);
这样一般都没问题
=================================================
如果你是动态在你的线程里面创建这个控件的话就没问题
如果你是用消息线程创建的话就不行了,你无法在你自己创建的线程里使用
=================================================
原因我上面说了,OPENGL是线程安全的,它的渲染上下文是无法在多个线程里同时使用的;另:要开发OPENGL程序,如果你用MFC框架的话建议你先了解一下MFC;如果是纯SDK开发的话就需要着重研究OPENGL对运行环境的需求。可能你的VS版本高,有提供TIMER控件,这个是定时器来的,每间隔一段你定义好的时间它发送出一个WM_TIMER消息到你的窗口;如果你还不清楚TIMER的话建议你先去了解一下WINDOWS的消息机制;记住,OPENGL不是给初学编程的玩的;没有一定的基础,就算你写出了代码,你也不知道它为什么都是这样工作的;而且多线程编程是一个难点,不但要解决同步问题,调试起来也非常困难,经常会遇到些莫名其妙的问题。就像你这个问题一样,这问题是由于你对OPENGL运行要求不清楚导致的。
转载自:http://blog.sina.com.cn/s/blog_4bb59dc40100fa57.html
wglMakeCurrent:
函数设定OpenGL当前线程(线程相关性)的渲染环境。以后这个线程所有的OpenGL调用都是在这个hdc标识的设备上绘制。你也可以使用wglMakeCurrent 函数来改变调用线程的当前渲染环境,使之不再是当前的渲染环境。
注意:
hdc参数的绘制表面必须是支持OpenGL的。它不需是wglCreateContext 创建hglrc时所传进来的hdc,但它必须是相同的设备并具有相同的像素格式。GDI转换的hdc将不被渲染环境所支持。当前的渲染环境将一直使用hdc设备环境直到它不再是当前渲染环境。
在切换到新的渲染环境之前,OpenGL将冲刷掉当前调用线程之前的所有渲染环境。
一个线程可以有一个渲染环境。所以一个多线程进程可以有多个渲染环境。一个线程在调用任何OpenGL函数之前必须设置一个当前渲染环境。否则所有OpenGL调用都将忽略。
在某一时刻渲染环境只能属于一个线程,你不能使一个渲染环境同时属于多个线程。
一个应用程序可以通过不同线程中的不同的当前渲染环境产生多个绘图,它支持各个线程都拥有自己的渲染环境的设备环境。
如果有错误发生,wglMakeCurrent 函数在返回之前将使渲染环境不作为线程当前的渲染环境。
转载自:http://topic.csdn.net/u/20080408/17/54b76b63-1c46-4340-80ef-2b5bc4859f0c.html
找到了!
原来是因为OpenGL Context同时只能被一个线程拥有,而在创建OpenGL窗口时被主线程占据了。解决方法是用函数wglMakeCurrent( HDC hdc,HGLRC hglrc),该函数可以将OpenGL Context关联到调用此函数的线程:在主线程里加上一句wglMakeCurrent(NULL,NULL),解除关联,在子线程开始时用wglMakeCurrent(hdc,hglrc)使子线程取得Context就行了。
我是在一篇关于多线程的OpenGL的英文资料里看到的,原文主要是解决同时用两个线程操作OpenGL:一个渲染,一个创建显示列表。他用的方法是在渲染时渲染线程取得Context,结束后释放,另一个线程再占用……这样循环。
我估计甚至可以用wglMakeCurrent进行切换,实现多个线程同时往一个窗口上作图!当然不是完全同时,只是轮流占用而已。不过这样效率并不高,除了用于防止用户界面线程因作图运算量太大而被阻塞,应该没什么用处。
-----------------------------------------------
终于取到了glGenTextures(1, (UINT*)&m_nTexID)函数中的m_nTexID的值了,真不容易啊...
原来就是在子线程中取hDC和hRC,然后子线程运行完再返还hDC和hRC,不知道我这样说你理解不理解,不理解可以给我留言。呵呵
发表评论
-
Windows窗口和消息(2)
2012-01-20 00:26 466Windows窗口和消息(2) 2011 ... -
Windows Azure真实案例--Lokad 公司通过软件+服务高效提供先进的预测服务
2012-01-20 00:26 573Windows Azure真实案例--Loka ... -
windows下实现微秒级的延时
2012-01-20 00:26 1144windows下实现微秒级的延时 2010年11月17日 ... -
探究 Windows Vista 中新的语音识别与合成 API(转)
2012-01-20 00:26 932探究 Windows Vista 中新的 ... -
方法总比问题多,解决打不开windows mobile工程的问题。
2012-01-20 00:26 936方法总比问题多,解决打 ... -
晒晒孩子们的作文(一)
2012-01-19 01:23 627晒晒孩子们的作文(一) ... -
爱,不是曾经
2012-01-19 01:23 518爱,不是曾经 2011年12月1 ... -
代码例子区全区搜索索引(27th Feb 2011 Updated)
2012-01-17 00:39 605代码例子区全区搜索索引(27th Feb 2011 Updat ... -
基于Windows CE的激光切割机开放式数控系统的研究
2012-01-17 00:39 532基于Windows CE的激光切割 ... -
转: Boost下载安装编译配置使用指南(含Windows和Linux)
2012-01-17 00:39 603转: Boost下载安装编译配 ... -
windows编程经典书籍
2012-01-17 00:39 680windows编程经典书籍 2011年07月04日 [转 ... -
la la la la
2012-01-15 15:00 585la la la la 2009年11月09日 ... -
铁路企业职工再加薪 一线员工每月至少涨620元
2012-01-15 15:00 685铁路企业职工再加薪 一 ... -
7689
2012-01-15 15:00 5687689 2009年09月28日 家长会发言稿 家长 ... -
泰国副总理:已获本国军人杀害中国船员充分证据
2012-01-15 15:00 408泰国副总理:已获本国军人杀害中国船员充分证据 2012年01 ...
相关推荐
本人原创,浅显易懂,QT+OPENGL多线程,采用2D纹理贴图的方式,多线程进行纹理拷贝和渲染。
winform datagridview多线程出现红叉解决方案,只要将运行的代码由创建线程调用就OK了
用多线程实现OpenGL渲染, 子线程负责渲染, 主线程负责干其他事情.
win32窗口实现的多显示器多窗口多线程OpenGL程序源代码. 可以全屏及窗口显示.
C#多线程解决界面卡死问题的完美解决方案,简化了之前的写法,更容易记住和理解 C#多线程解决界面卡死问题的完美解决方案,简化了之前的写法,更容易记住和理解
《MFC多线程的创建,包括工作线程和用户界面线程》全面讲解MFC多线程的创建,界面多线程与工作者多线程,多线程的起源、继承与派生,两多线程之间的区别与相同点,定时器与多线程的关系与异同(定时器是定时优先抢占...
发了一天功夫才把多线程的问题搞定,上传以后使用。若其他读者看到,希望能看懂我的苦心。thread相关的CPP需要你自己加上去,它们在压缩文件里面。
C# winform 动态创建和 关闭多线程,基于VS2010的完整解决方案。 可运行
SpringMVC简介与多线程解决方案SpringMVC简介与多线程解决方案SpringMVC简介与多线程解决方案
MessageBox("创建线程失败"); } 7. 编写线程函数(一般是一个死循环,或者需要花费时间很长的算法!否者就失去了多线程的意义) DWORD WINAPI ThreadFun(LPVOID pthread) //线程入口函数 { lpthread temp=...
操作系统的第二个实验,Linux多线程创建
采用VBO技术的真正的多线程多窗口OpenGL程序 vs2008编译通过。
经常会遇到下述问题:很多io busy的应用采取多线程的方式来解决,但这时候会发现python命令行不响应ctrl-c 了,而对应的java代码则没有问题: 复制代码 代码如下: public class Test { public static void main...
vc下多线程的创建 视频解析 希望大家喜欢
C#多线程解决界面卡死问题的完美解决方案
基于vs2013平台,创建多线程的教程,基于vs2013平台,创建多线程的教程,基于vs2013平台,创建多线程的教程
例如: for (int i = 0; i ; i++) { Thread thread = new Thread(test) ;... 请下载解决方案。 呵呵,这个实例10分值的买, 觉得好的话就评个分吧,评分后会返回你11分 (一定要评分,光评论是不返分的)
(1)掌握Windows系统提供的线程创建与撤销系统调用 (2)掌握Windows系统环境下线程的创建与撤销方法 2 实验准备知识 (1)线程创建 CreateThread()完成线程的创建。它在调用进程的地址空间上创建一个线程,执行...
MFCwithOpenGLWindow-用多线程方法实现在MFC/WIN32中调用OpenGL函数并创建OpenGL窗口源码.
由于耗时的操作会独占系统cpu资源 ,让界面卡死在那里,这时需要考虑多线程方案,将耗时的操作放在主线程之外的线程中执行。该demo通过多线程为主界面卡死提供一种解决方案。