Многопоточные приложения Qt, приводящие к краху Windows - PullRequest
0 голосов
/ 08 апреля 2011

Ну, проблема довольно сложная.Я не знаю с чего начать.Мое приложение запускает 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...