我在一个timer中为了根据数据变换pen的颜色,需要在timer中createpen,结果程序跑一
阵子createpen返回值开始为NULL,继续往下debug时程序会在selectobject处会跳到win
core.cpp中的某个位置(不知道是不是什么抛出异常之类的)。程序都是一开始正常,然后运行100s左右才会出现这个情况,任务管理器中从头到尾GDI
资源并没有一直增长,内存和处理器占用也没有增长。CreatePen()返回0,之后GetLastE
rror返回0;无法运行到SelectObject下一步,F10会直接执行到下次进入该Timer在Sele
ctObject之前的断点,无断点的话就进入wincore.cpp了。代码大致如下:
TimerProc
{
...
pDC=pThis->picturecontrl.GetDC();
CPen pen;//甚至试过每次*pen=new CPen然后再delete pen;--!
pen.CreatePen(...)//CreatePenIndirect也试过了
old_pen=pDC->SelectObject(&pen);
...
pDC->SelectObject(old_pen);
pen.DeleteObject();
pThis->ReleaseDC();
...
}真心求教T_T,帮帮忙吧~
ctObject之前的断点,无断点的话就进入wincore.cpp了。代码大致如下有错误。F11看看
资源管理器里显示GDI资源没有增加,而且我的流程中有什么可能造成GDI资源没有有效释放的操作么?
pDC=pThis->picturecontrl.GetDC();
......
pThis->ReleaseDC();
发现在pDC=picturecontrol.GetDC()
那一步返回值也是0了,所以说getDC和createpen都失败了....这是什么情况?
要写一个画图这部分功能的函数把上面的代码放进去么?
pDC->ReleaseDC();
pDC->ReleaseDC();
==========
错了,应该这样写:
pThis->picturecontrl.ReleaseDC();
我写的是
pThis->ReleaseDC(pDC);有问题么?
现在即使换成pThis->picturecontrl.ReleaseDC();
问题依旧....
我写的是
pThis->ReleaseDC(pDC);有问题么?
========
你前面的DC是picturecontrl的DC,现在释放当然也是释放这个DC了.
另外,pDC这个指针是什么变量呢?它的定义部分你放到什么地方了?
所以只用在pDC=picturecontrol.getDC()
然后pDC->各种画
然后pThis->ReleaseDC(pDC);这个效果是不是和picturecontrol.releasedc()一样啊?
=============
当然不一样了,你的pThis和picturecontrol难道是同一个CWnd对象啊?CDC* pDC也在这个timerproc中定义的,就是用来表示picturecontrol的dc的
================
如果你是new出来的话,最后不用时你必须要delete
pThis->picturecontrl.ReleaseDC(pDC);
他都pDC=pThis->picturecontrl.GetDC()了,你还让他delete什么啊?
把这个删除应该就没问题了
这个是在程序结束的时候调用的,你每次都释放,在ONPAINT里面调用不到DC就会出问题的。
DC不是你在timer里创建的,你只是在timer里调用,所以不需要释放
if(pDC == NULL) {
DWORD dw = ::GetLastError(); // 在这里设断点,看看错误号是多少。
}
程序运行一段时间以后,pDC=pictrl.GetDC()和pen.CreatePen()都会返回0
SetTimer(1,30,timerproc1)
SetTimer(2,30,timerproc2)
它们俩如果同时执行的话会不会有同时GetDC的问题,他们俩如果依次执行的话先执行哪一个?
HWND hWnd;
HDC hDC;
HPEN hPen, hOldPen;hWnd = pThis->picturecontrl.GetSafeHwnd();
hDC = ::GetDC(hWnd);
if(hDC == NULL) {
DWORD dw = ::GetLastError(); // 在这里设断点,看看错误号是多少。
}hPen = ::CreatePen(...);
if(hPen == NULL) {
DWORD dw = ::GetLastError(); // 在这里设断点,看看错误号是多少。
}
hOldPen=(HPEN)::SelectObject(hDC, hPen);
......
::SelectObject(hDC, hOldPen);
::DeleteObject(hPen);
::ReleaseDC(hWnd, hDC);
SetTimer(1,30,timerproc1)
SetTimer(2,30,timerproc2)
它们俩如果同时执行的话会不会有同时GetDC的问题,他们俩如果依次执行的话先执行哪一个?
==========
不会同时执行的,你这个还是单线程的。
不过发现是CreatePen先返回0,这个时候hDC是正常的,但这之后再次进入这里,hDC也变成0了
GetLastError一直是0....
CPen pen;
pen.createpen()
oldpen=selectobject(&pen)
...
selectobject(old_pen)
...
oldpen=selectobject(&pen)
...
selectobject(old_pen)
pen.deleteObject();
如果把这个关于这个pen使用的代码去掉就好了。pen也属于gdi资源是吧?声明和释放的时候应该注意什么?