多线程Qt应用程序崩溃Windows

时间:2011-04-08 07:57:45

标签: windows multithreading qt

那么问题非常复杂。我不知道从哪里开始。我的应用程序运行4个线程DGRDPClientThread

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如果当前缓冲区与旧缓冲区相同,则将其重新设置为非零值。< / p>

我的问题是:它运行正常,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;
}

0 个答案:

没有答案