Russian Qt Forum
Ноябрь 25, 2024, 06:43 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Крашится программа ,в чем ошибка?  (Прочитано 5808 раз)
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 отмечены. Он почему то выполняет цикл один раз и программа крашится. В чем может быть причина?
Любую доп. информацию предоставлю ,заранее спасибо за помощь.
Записан
mutineer
Гость
« Ответ #1 : Октябрь 19, 2013, 00:09 »

дебаггером смотрел где падает и как?
Если хочешь использовать сокет в синхронной манере, то стоит использовать waitForConnected, waitForBytesWritten...
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #2 : Октябрь 19, 2013, 00:09 »

1) Покажи код заполнения этого map-a. 2) "const QString &mess = editMessage->toPlainText();" - объясни зачем тут & 3) сокет работает не в синхронном режиме
Записан
Trademaster
Гость
« Ответ #3 : Октябрь 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
Что такое синхронный режим сокета?
Записан
schmidt
Гость
« Ответ #4 : Октябрь 19, 2013, 12:48 »

Цитировать
Он почему то выполняет цикл один раз и программа крашится. В чем может быть причина?
Руки? Подмигивающий

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

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

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

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


Для того, чтобы определить в каком месте программа рушится, запускайте ее под отладчиком. В этом случае она как минимум выдаст сообщение об ошибке и остановится в отладчике, а не просто вылетит.
Записан
Trademaster
Гость
« Ответ #5 : Октябрь 20, 2013, 03:08 »

Почти в точку Улыбающийся Я пытаюсь приконектить уже приконекченный сокет.
Вот ошибка :
QAbstractSocket::connectToHost() called when already looking up or connecting/connected to "localhost"

Но вот как это исправить я так и не понял Грустный
Записан
mutineer
Гость
« Ответ #6 : Октябрь 20, 2013, 11:41 »

Вставь waitForConnected и waitForBytesWritten
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.049 секунд. Запросов: 22.