【发布时间】:2011-08-15 13:26:08
【问题描述】:
我有一个调用GetWindowDC(NULL) 的函数。并且该函数由不同的线程调用。有时我看到GetWindowDC(NULL) 返回0x0 为什么?以及如何解决?该功能已正确保护互斥锁。所以那不是问题。每次通话后我需要sleep()几毫秒吗?为什么?
http://msdn.microsoft.com/en-us/library/dd144947%28v=vs.85%29.aspx
msdn 说
返回值
如果函数成功,则返回值是指定窗口的设备上下文句柄。 如果函数失败,返回值为NULL,表示错误或无效的hWnd参数。
但是这表示错误意味着我无法理解
编辑:
并且是的,我正在释放所有 DC 并正确删除 DC
立即致电GetLastError 回复0
试过了。
if(hdc == 0x0)
qDebug() << GetLastError()
这是我的源代码。它有效,但在工作超过 100 次(35-40 秒)后,它拒绝工作,GetWindowDC(NULL) 返回 0
QPixmap Util::grabScreen(const DG::Rect* rect){
mutex.lock();
HDC hdc=GetWindowDC(NULL);
HWND win=WindowFromDC(hdc);
HDC cdc=CreateCompatibleDC(hdc);
HBITMAP temp=CreateCompatibleBitmap(hdc,rect->width,rect->height);
PAINTSTRUCT ps;
hdc=BeginPaint(win,&ps);
HBITMAP oldb=(HBITMAP)SelectObject(cdc,temp);
BitBlt(cdc,0,0,rect->width,rect->height,hdc,rect->top,rect->left,SRCCOPY);
SelectObject(cdc,oldb);
EndPaint(win,&ps);
char* buff;
buff = new char[rect->size()];
GetBitmapBits(temp,rect->size(),buff);
qDebug() << "temp" << temp;
if(temp == 0x0){
qDebug() << "hdc" << hdc;
}
DeleteDC(cdc);
ReleaseDC(NULL, hdc);
DeleteDC(hdc);
QPixmap pixmap = QPixmap::fromWinHBITMAP(temp);
//QPixmap pixmap = QPixmap::grabWidget(desktopWidget,rect->toQRect());
mutex.unlock();
return pixmap;
}
【问题讨论】:
-
DC 的数量有限,您究竟多久调用一次 GetWindowDC? ...您是否将其释放回系统?
-
是的,我将在最后发布和删除 DC。并且这个函数被16个线程同时调用。我数过几次。但它似乎非常非常频繁。那么我应该
sleep()多久? -
在函数失败后立即调用
GetLastError()应该会给你更多关于发生了什么的信息。 -
@Dave Rager:我刚刚试了一下。
if(hdc == 0x0)qDebug() << GetLastError()它返回0。那么可能是什么原因造成的呢? -
你解决过这个问题吗?