Ну, проблема довольно сложная.Я не знаю с чего начать.Мое приложение запускает 4 потока DGRDPClientThread
.
a DGRDPClientThread
имеет 1 DGRegion
с QList<DGRect*>
.
на 1000 ms
Интервал DGRDPClientThread::tick()
вызывается, что вызывает _region->update()
void DGRegion::update() const{
foreach(DGRect* rect, rects){
if(rect->scan() != 0){
mutex.lock();
QByteArray buffer = rect->serialize();
//socket->send(buffer);
qDebug() << buffer;
mutex.unlock();
}
}
}
rect->scan()
читает прямоугольную область экрана в char* buffer
и затем помещает его в QByteArray
, если текущий буфер совпадает со старым буфером, он возвращает 0, иначе ненулевое значение.
Моя проблема: Он работает правильно и qDebug()
печатает буфер в течение нескольких минут.а потом вдруг это останавливается.Все окно зависает.и мое приложение вылетает.Я не думаю, что это из-за утечки памяти.Я delete
редактировал каждый раз, когда звонил new
, и это единственный мьютекс во всем приложении.Диспетчер задач говорит, что он не делает огромные Mem Use
Однако, в то время как замораживание требует огромных CPU
Я не знаю, почему я не могу отладить это приложение.Он говорит, что приложение запущено в окне отладки.Его не началось на самом деле.и я не вижу свои темы в выпадающем списке ...
РЕДАКТИРОВАТЬ
int DGRect::scan(){
HDC hdc=GetWindowDC(NULL);
HWND win=WindowFromDC(hdc);
HDC cdc=CreateCompatibleDC(hdc);
HBITMAP temp=CreateCompatibleBitmap(hdc,width,height);
PAINTSTRUCT ps;
hdc=BeginPaint(win,&ps);
HBITMAP oldb=(HBITMAP)SelectObject(cdc,temp);
BitBlt(cdc,0,0,width,height,hdc,top,left,SRCCOPY);
SelectObject(cdc,oldb);
EndPaint(win,&ps);
char* buff;
buff = new char[size()];
GetBitmapBits(temp,size(),buff);
QByteArray returnBuff(buff, size());
if(returnBuff != buffer){
buffer.clear();
buffer = returnBuff;
delete[] buff;
qDebug() << ">> \t\t\t\t UnMatched";
return 1;
}
delete[] buff;
qDebug() << ">> \t\t\t\t\t\t MATCHED";
return 0;
}
QByteArray DGRect::serialize() const{
QByteArray buff;
QTextStream stream(&buff, QIODevice::ReadWrite);
stream << row << col << left << top;
//stream << buffer;
//stream << qCompress(buffer, 8).toBase64();
stream.flush();
return QByteArray::number(row)+" "+QByteArray::number(col)+" "+QByteArray::number(left)+" "+QByteArray::number(top)+" "+QByteArray::number(buffer.size())+";";
return buff;
}