Сервер Qt вылетает с ошибкой ASSERT: “!isEmpty()” in file ..\..\include/QtCore/../../src/corelib/tools/qlist.h, line 344

412
21 мая 2017, 23:48

При загрузке файла сервером с клиента на java сервер вылетает с ошибками:

ASSERT: "!isEmpty()" in file ..\..\include/QtCore/../../src/corelib/tools/qlist.h, line 344
ASSERT: "!isEmpty()" in file ..\..\include/QtCore/../../src/corelib/tools/qlist.h, line 348   

Интересно, что когда все это работало в основном потоке, не вылетало. Краткий код:

/*tcpservthread.h ну это очень кратко там еще много моего быдлокода*/
    class TcpServThread: public QThread
    {
        Q_OBJECT
    private:
        int keyFiles = 0;   
        bool writefilepr = false;
        QFile* rfile;
        ResponseFileObj* rfo = 0;
        QTcpSocket* pClientSocket;
   public slots:
       void slotReadClient   ();

}
/*tcpservthread.cpp*/
TcpServThread::TcpServThread(qintptr ID, QObject *parent):
    QThread(parent)
{
    this->socketDescriptor = ID;
}
void TcpServThread::run()
{
    pClientSocket = new QTcpSocket();
    if(!pClientSocket->setSocketDescriptor(this->socketDescriptor))
    {
        return;
    }
connect(pClientSocket, SIGNAL(disconnected()),pClientSocket, SLOT(deleteLater()));
    connect(pClientSocket, SIGNAL(disconnected()),this, SLOT(sldiconnected()));
    connect(pClientSocket, SIGNAL(readyRead()),this,SLOT(slotReadClient()));
    connect (pClientSocket,SIGNAL(error (QAbstractSocket::SocketError)),this,SLOT (slotSocketError (QAbstractSocket::SocketError)));
exec();
}
void TcpServThread::slotReadClient()
{
//Эту переменную обнулим когда файл полностью прочитаем по ней ориентируемся 
//что нам делать если twobytes==0 то значит мы не закончили с определенной 
// командой например загр файла
if(twobytes==0) { 
        float ltwobytes;
        int lsixbytes;
        if(readFirstInfo(ltwobytes, lsixbytes)) {
            twobytes = ltwobytes;
            sixbytes = lsixbytes;
        } else {
            return;
        }
    }
if(twobytes == COM_LOAD_FILE) { 
   int avaib = pClientSocket->bytesAvailable();
        if(avaib==0 || avaib<0) {
            return;
        }
        //Смотрим есть ли у нас список файлов вобьекте, нет парсим
        if(!rfo) {
            QString infostr = readMainStr(false);
            qDebug() <<"twobites|sixbytes" <<twobytes <<sixbytes;
            if(infostr=="") {
                return;
            }
            rfo = parseToCl(infostr);
        }
int fsize = rfo->files.size();
        //Вот в этом цикле и происходит загрузка файла с клиента,
    //но в нем пока 1 единственный файл и все это вылетает с ошибкой
    //наверное я делаю что то не так 
        //MFile - обьект с информацией по загружаемому файлу
    //keyFile ключ который я сохраняю чтобы не проходить список загр. файлов с самого начала 
        for(int i= keyFiles; i<fsize; i++) {
            MFile file = rfo->files[i];
            avaib = pClientSocket->bytesAvailable();
            if(file.isDirectory()) {
                // //тут оперции по созданию папок не буду приводить будем считать что это 1 файл
            } else {
                if(avaib == 0) {
                    keyFiles = i;
                    break;
                }
                //сперва глянем писался ли файл
                if(writefilepr) {
                   //да он писался
                } else {
                    rfile = new QFile(file.getAbsolutePuth());
                    if(!rfile->open(QIODevice::WriteOnly)){qDebug() << "Ошибка открытия для записи";}
                    writefilepr = true;
                }
                long msize=0;
                //Сколько байтов записало
                if(writingBytes>0) {
                    msize = file.length()-writingBytes;
                } else {
                    msize = file.length();
                }
                if(avaib > msize || avaib == msize) {
                    qDebug() <<"iatyt1";
                    QByteArray b = pClientSocket->read(msize);
                    rfile->write(b);
                    rfile->close();
                    writingBytes = 0;
                    writefilepr = false;
                    qDebug() <<"iatyt2";
                    continue;
                } else {
                    qDebug() <<"iatyt3";
                    QByteArray b = pClientSocket->read(avaib);
                    rfile->write(b);
                    writingBytes += avaib;
                    keyFiles = i;
                    qDebug() <<"writebytes=" <<writingBytes <<"|keyFiles="<<keyFiles <<"file.size=" << file.length();
                    qDebug() <<"iatyt4";
                    break;
                }
            }
}
}

Там было немного сложнее, но я решил переписать, чтобы вычислить ошибку - результат тот же самый - вылетает.

READ ALSO
Проблема с release версией игры на sfml

Проблема с release версией игры на sfml

Здравствуйте, подскажите пожалуйста, не могу запустить игру в релизеПрописал в input sfml-graphics

332
Посчитать бит и записать в файл

Посчитать бит и записать в файл

Добрый день, передом мной появилась такая задача: Я имею программу, которая подбирает данные из COM to USB и она передает строки, непрерывно 20 минутСтрока...

272
Конвертер из jQuery в чистый JavaScript

Конвертер из jQuery в чистый JavaScript

Подскажите, пожалуйста, есть ли какой-нибудь инструмент способный преобразовать jQuery код в чистый JavaScript?

783
Framework7 Autocomplete navbar не показывает

Framework7 Autocomplete navbar не показывает

В чем проблема то вот я использовал этот метод - Standalone With Ajax Data https://framework7io/docs/autocomplete

298