Russian Qt Forum

Qt => Вопросы новичков => Тема начата: CJ1 от Июнь 16, 2012, 09:03



Название: С конструктором помогите
Отправлено: CJ1 от Июнь 16, 2012, 09:03
Вобщем в объекте главного окна добавляю

Код:
private:

    QByteArray block2;
    QDataStream out2;


В функции нужно как бы инициализировать out2 но не получается!

Код:
void EditTable::on_action_2_triggered()
{
    out2 = QDataStream(&block2,QIODevice::WriteOnly);

    import dlg(this);
    dlg.exec();

    block2.clear();
}

out2 = QDataStream(&block2,QIODevice::WriteOnly);
Дает ошибку, но это не правильно я знаю, но как подругому сделать?


Название: Re: С конструктором помогите
Отправлено: mutineer от Июнь 16, 2012, 09:56
void QDataStream::setDevice ( QIODevice * d )

или создавать QDataStream динамически


Название: Re: С конструктором помогите
Отправлено: CJ1 от Июнь 16, 2012, 09:59
Я так и сделал QDataStream * out2
Теперь добавляю данные вот так *out2 << "asd";

Правильно?


Название: Re: С конструктором помогите
Отправлено: mutineer от Июнь 16, 2012, 10:03
Я так и сделал QDataStream * out2
Теперь добавляю данные вот так *out2 << "asd";

Правильно?

Если работает, то ответ очевиден, если не работает - рассказывай как не работает


Название: Re: С конструктором помогите
Отправлено: CJ1 от Июнь 16, 2012, 10:20
Вобщем, люди, давайте я постараюсь объяснить все заного, я уже двое суток с этим борюсь!

Смотрите, я беру данные с excel, думаю тут код не нужно писать, так как все проходит ровно!
Во время заполнения я сразу эти данные кидаю в QTableWidget

Далее срабатывает вот это событие

Код:
void EditTable::on_tableWidget_cellChanged(int row, int column)
{
    if (alledit){
       // QMessageBox::information(0,"","alledit");
        *out2 << qint8('Y');
        *out2 << ui->tableWidget->item(row,0)->text();
        *out2 << ui->tableWidget->item(0,column)->text();
        *out2 << ui->tableWidget->item(row,column)->text();
        if (column < 5){
            *out2 << qint8('1');
        } else{
            *out2 << qint8('2');
        }
        can_do = true;
    }
   
}

Оно записывает в эти out ы данные.
Когда запишутся вызывается вот это
Код:
void EditTable::on_action_2_triggered()
{
    *out2 << qint8('N');
    if (alledit == false){
        QMessageBox::information(0,"отправка блока",block2.toHex());
        _sock->write(block2);

    } else alledit = false;
    block2.clear();
}

И вот тут начинаются косяки.

Постараюсь объяснить на пальцах какие.

Вот выполнилось все что я сказал выше.
На сервак ничего не попало!

Ладно....

Начинаю в своей проге, обращатся к серваку, разными способами, но мои обращения, он не видит, а за место них видит то что я послал тут _sock->write(block2); (чууть выше код)

Ну вобщем вот так! Как еще это объяснить я не знаю. На Win API я никогда не встречал подобного! Как это решается....


Название: Re: С конструктором помогите
Отправлено: CJ1 от Июнь 16, 2012, 10:22
Чуть не забыл! ОШИБКИ НЕ ВОЗВРАЩАЕТ!!!!


Название: Re: С конструктором помогите
Отправлено: mutineer от Июнь 16, 2012, 10:24
_sock->flush() попробуй делать после записи в сокет


Название: Re: С конструктором помогите
Отправлено: CJ1 от Июнь 16, 2012, 10:24
Ставлю гребанные QMessageBox между кодом и все отлично работает!


Название: Re: С конструктором помогите
Отправлено: CJ1 от Июнь 16, 2012, 10:27
_sock->flush() попробуй делать после записи в сокет

_sock->flush() попробуй делать после записи в сокет

А где именно, в цикле?ч


Название: Re: С конструктором помогите
Отправлено: CJ1 от Июнь 16, 2012, 10:37
Куда только не ставил не действует!


Название: Re: С конструктором помогите
Отправлено: CJ1 от Июнь 16, 2012, 10:41
Вот хоть убей его, а QmessageBox ставишь, и постоянно ОК жмешь и все как по маслу идет!
Код:
void EditTable::on_tableWidget_cellChanged(int row, int column)
{

    if (edit){
         QByteArray block;
        QDataStream out(&block,QIODevice::WriteOnly);
        out.setVersion(QDataStream::Qt_4_7);
        out <<quint8('U');
        out <<quint8('A');
        out << ui->tableWidget->item(row,0)->text();
        out << ui->tableWidget->item(0,column)->text();
        out << ui->tableWidget->item(row,column)->text();
        if (column < 5){
            out << qint8('1');
        } else{
            out << qint8('2');
        }

        QMessageBox::information(0,"",block);
        int size = _sock->write(block);
        _sock->flush();




    }
    can_do = true;


Название: Re: С конструктором помогите
Отправлено: CJ1 от Июнь 16, 2012, 10:42
Я не пойму, ну почему соккет работает ассинхронно! Мне это не надо! Работал бы синхронно и не возвращал бы управления пока все не отправит!


Название: Re: С конструктором помогите
Отправлено: alexis031182 от Июнь 16, 2012, 10:54
QAbstractSocket::waitForBytesWritten()


Название: Re: С конструктором помогите
Отправлено: CJ1 от Июнь 16, 2012, 10:57
Сделал так,
Код:
        int size = _sock->write(block);
        _sock->flush();
        while (!_sock->waitForBytesWritten(-1)){
             _sock->flush();
        }

Теперь не все отсылаются, хотя и отсылаются


Название: Re: С конструктором помогите
Отправлено: alexis031182 от Июнь 16, 2012, 11:07
Уберите "-1"


Название: Re: С конструктором помогите
Отправлено: CJ1 от Июнь 16, 2012, 11:10
Намертво виснит!


Название: Re: С конструктором помогите
Отправлено: CJ1 от Июнь 16, 2012, 11:11
Думаю, придется после каждого запроса присылать ответ от сервера


Название: Re: С конструктором помогите
Отправлено: alexis031182 от Июнь 16, 2012, 11:17
Намертво виснит!
flush() по идее не нужен, если сокет используется в блокирующем режиме


Название: Re: С конструктором помогите
Отправлено: CJ1 от Июнь 16, 2012, 11:39
Убрал, и разници никакой... Понять бы в чем причина!


Название: Re: С конструктором помогите
Отправлено: CJ1 от Июнь 16, 2012, 11:41
Сделал, чтоб после того как на сервер приходит сообщения, и он сделал все что нужно, от него приходил ответ,
Но ответ приходит только в том случае, если я например, сверну окно, или нажму на кнопку.....


Название: Re: С конструктором помогите
Отправлено: CJ1 от Июнь 16, 2012, 11:43
Может у кого было подобное, а?

Вот что дает сворачивания окна скажем?
А что дает вызов MessageBox а?


Название: Re: С конструктором помогите
Отправлено: CJ1 от Июнь 16, 2012, 12:10
Ни как не выходит


Название: Re: С конструктором помогите
Отправлено: Alex_C от Июнь 18, 2012, 09:51
А что дает вызов MessageBox а?
Наверное в данном случае добавление MessageBox создает эффект QCoreApplication::processEvents ();


Название: Re: С конструктором помогите
Отправлено: Bepec от Июнь 18, 2012, 20:39
Таки оно и есть. Оно принудительно его вызывает :)


Название: Re: С конструктором помогите
Отправлено: CJ1 от Июнь 19, 2012, 07:08
Да, я уже решил вопрос, вся проблема просто была в том, что я тупо, на серваке, хватал первую порцию данных, и работал с ней, Теперь я просто первыми двумя байтами qint16 пересылаю размер будущих данных а на серваке делаю цикл в потоке который обрабатывает входящее соединения, делаю QCoreApplication::processEvents () пока не придут все данные