У меня есть функция, которая вызывает GetWindowDC(NULL)
. и эта функция вызывается разными потоками. иногда я вижу GetWindowDC(NULL)
возвращающихся 0x0
Почему? и как решить? функция - мьютекс Так что это не проблема. Нужно ли sleep()
несколько мс после каждого звонка? и почему ?
http://msdn.microsoft.com/en-us/library/dd144947%28v=vs.85%29.aspx
MSDN говорит
Возвращаемое значение
Если функция завершается успешно, возвращаемое значение является дескриптором контекста устройства для указанного окна.
Если функция завершается ошибкой, возвращаемое значение равно NULL, указывает на ошибку или неверный параметр hWnd.
но Что это означает , означающее ошибку означает, что я не мог понять
Edit:
и я освобождаю все контроллеры домена, а также правильно удаляю контроллеры домена.
Позвонить GetLastError
retrns 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;
}