multithreading - Multithreaded Qt Application Crashing Windows

Indlæg af Hanne Mølgaard Plasc

Problem



Nå Problemet er ret komplekst. Jeg ved ikke, hvor jeg skal starte. Mit program kører 4 tråde DGRDPClientThread.


a DGRDPClientThread har 1 DGRegion som har QList<DGRect*>.


1000 ms Interval DGRDPClientThread::tick() påberåbes, som kalder \_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() læser et rektangulært område af skærmen i en char* buffer og derefter sætter det en QByteArray, hvis den nuværende buffer er den samme som den gamle buffer, genoptages den 0 othewise en ikke-nul-værdi.


Mit problem er: Det kører ordentligt og qDebug() udskriver buffer i få minutter. og så stopper det pludselig. Hele vinduet fryser. og min ansøgning går i stykker. Jeg tror ikke det skyldes hukommelselækage. Jeg delete ed, når jeg ringede new, og dette er den eneste mutex i hele appen. Task Manager siger, at det ikke gør stor Mem Use]] Men mens Frysning tager det Kæmpe CPU


Jeg ved ikke hvorfor jeg ikke kan debug denne app. Det siger Application Started i debug Window. Det er det ikke startet faktisk. Og jeg kan ikke se mine tråde i drop drop-boxen ...


EDIT



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() << ">> 				 UnMatched";
        return 1;
    }
    delete[] buff;
    qDebug() << ">> 						 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;
}

Bedste reference