Russian Qt Forum

Qt => Общие вопросы => Тема начата: Trademaster от Октябрь 19, 2013, 00:00



Название: Крашится программа ,в чем ошибка?
Отправлено: Trademaster от Октябрь 19, 2013, 00:00
Всем привет. И так.
Есть цикл :
Код:
for(int i = 0; i < id; i++)
    {
        if(cb[i]->isChecked())
        {
            qDebug() << "+1";
            QString host;
            host = mainTable->item(i,0)->text();
            const QString &mess = editMessage->toPlainText();
            qDebug() << mess;
            mainSocket->connectToHost(host,3333);
            QByteArray arrBlock;
            QDataStream out(&arrBlock,QIODevice::WriteOnly);
            out.setVersion(QDataStream::Qt_4_2);
            out << quint16(0) <<  mess;

            out.device()->seek(0);
            out<< quint16(arrBlock.size() - sizeof(quint16));

            mainSocket->write(arrBlock);
            mainSocket->disconnectFromHost();
            mainSocket->close();
        }


    }
Он проверяет QMap ,в QMap'e лежат chekbox'ы ,он проверяет ,отмечены они или нет.
Если они отмечены ,то посылает на сервер данные. Так вот. Предположим есть 5 чекбокосв ,из них 2 отмечены. Он почему то выполняет цикл один раз и программа крашится. В чем может быть причина?
Любую доп. информацию предоставлю ,заранее спасибо за помощь.


Название: Re: Крашится программа ,в чем ошибка?
Отправлено: mutineer от Октябрь 19, 2013, 00:09
дебаггером смотрел где падает и как?
Если хочешь использовать сокет в синхронной манере, то стоит использовать waitForConnected, waitForBytesWritten...


Название: Re: Крашится программа ,в чем ошибка?
Отправлено: Alex Custov от Октябрь 19, 2013, 00:09
1) Покажи код заполнения этого map-a. 2) "const QString &mess = editMessage->toPlainText();" - объясни зачем тут & 3) сокет работает не в синхронном режиме


Название: Re: Крашится программа ,в чем ошибка?
Отправлено: Trademaster от Октябрь 19, 2013, 00:25
1) Покажи код заполнения этого map-a. 2) "const QString &mess = editMessage->toPlainText();" - объясни зачем тут & 3) сокет работает не в синхронном режиме

Код:
void MainWindow::addIp()
{
    cb[id] = new QCheckBox();
    mainTable->insertRow(row);
    mainTable->setCellWidget(row,1,cb[id]);
                row++;
                id++;
}
Вызывается каждый раз при добавлении строки в таблицу
Изначально id = 0
Что такое синхронный режим сокета?


Название: Re: Крашится программа ,в чем ошибка?
Отправлено: schmidt от Октябрь 19, 2013, 12:48
Цитировать
Он почему то выполняет цикл один раз и программа крашится. В чем может быть причина?
Руки? ;)

Работа с удаленным сервером в отличие от локального файла происходит не мгновенно, поэтому нельзя писать так:

Код:
socket->connect();
socket->write();

Ибо на установку соединения необходимо время. Писать в сокет, который еще не соединен с сервером, очевидно, бессмысленно. Делайте так:

Цитировать
1. socket->connect()
2. <Ожидание готовности сокета...>
3. socket->write()
4. <Ожидание, пока данные будут записаны/отправлены...>
5. Закрытие сокета


Для того, чтобы определить в каком месте программа рушится, запускайте ее под отладчиком. В этом случае она как минимум выдаст сообщение об ошибке и остановится в отладчике, а не просто вылетит.


Название: Re: Крашится программа ,в чем ошибка?
Отправлено: Trademaster от Октябрь 20, 2013, 03:08
Почти в точку :) Я пытаюсь приконектить уже приконекченный сокет.
Вот ошибка :
QAbstractSocket::connectToHost() called when already looking up or connecting/connected to "localhost"

Но вот как это исправить я так и не понял :(


Название: Re: Крашится программа ,в чем ошибка?
Отправлено: mutineer от Октябрь 20, 2013, 11:41
Вставь waitForConnected и waitForBytesWritten