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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема  (Прочитано 3314 раз)
CJ1
Гость
« : Июнь 15, 2012, 16:41 »

Люди, объясните мне пожалуйста одну вещь, у меня какаето хрень в проге творится
Даже не знаю как описать!
Но Почемуто не выполняются некоторые сообщения.
А точнее, не отправляются данные по сокету.

У меня куча циклов.
Вот код
Код:
void import::on_pushButton_3_clicked()
{

    EditTable * TempEditTable=  (EditTable *)editwin;
    for (int i = 1; i < ui->tableWidget->rowCount(); i++){
        TempEditTable->addEndRow();
        TempEditTable->edit = true;
        for(int j = 0; j < ui->tableWidget->columnCount(); j++){
            for (int v = 1; v< TempEditTable->column();v++){
                if (TempEditTable->TableText(1,v) == ui->tableWidget->item(0,j)->text()){
                    QString value = ui->tableWidget->item(i,j)->text();
                     TempEditTable->edit = true;
                     TempEditTable->SetTableText(TempEditTable->row()-1,v,value);
                }
            }
        }
    }

    close();
}


Я то понимаю, что в очереди сообщений остается куча этих сообщений.
И чтоб сообщения прошли, нужно пользоваться
QApplication::processEvents();
Но я их между кодом, кучу наставил, и всеравно косяки лезут!
Тоесть данные по сокетам не всегда отправляются...

Низнаю как еще это вырозить.

Но если я проставлю между каждой строчкой кода QMessageBox то все работает отлично!
Помогите решить эту беду,
У меня куча слотов своих, и очень много данных по сокетам бегают,
И очень большие циклы
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #1 : Июнь 15, 2012, 16:57 »

какой-то код заполняет какую-то таблицу, не видно никаких сокетов и отправки каких-либо данных
Записан
CJ1
Гость
« Ответ #2 : Июнь 15, 2012, 17:01 »

Да хотябы вот!!!
Код:
void EditTable::on_tableWidget_cellChanged(int row, int column)
{

    if (edit){
        qDebug() << QString::number(row)+" x "+QString::number(column) << " = " <<  ui->tableWidget->item(row,column)->text();

        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');
        }

        _sock->write(block);


    }
}

qDebug() все показывает, а сокет неотправляет данные!!!!

Но если я в том коде наставлю в промежутках QMessageBox то все работает!
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #3 : Июнь 15, 2012, 17:05 »

проверь хотя бы код возврата из _sock->write() и выведи на консоль _sock->errorString()
Записан
CJ1
Гость
« Ответ #4 : Июнь 15, 2012, 17:17 »

Нет ошибки, байты отправляет правильно,

Вот программа большая, все написать немогу.

Но могу сказать еще кое что.
После того как я делаю большие циклы, то соккеты не отправляются и не принимается ответ, при чем если я на сервере даже српецально его отправля.


НО!!! Если я начинаю щелкать на кнопки, и отправляю еще кучу сообщений на сокет, то постипенно, программа начинает принимать и ответы от сервера, и до отсылать все что не отослала!

Вот такая же ситуация
Цитировать
            QString kz;
            QAxObject * range;
             //Выделяем память под каждую ячейку
             for(int i = intRowStart; i <=  intRowStart + intRows-1; i++) {
                 int ci =i-1;
                 bool matches = false;
                 if (ci != 0){
                     // Получаю ячейку с индексом i,j
                     range = worksheet->querySubObject("Cells(int,int)", i, 2 );
                     // Беру из ячейки значения
                    kz = range->property("Value").toString();
                   // QMessageBox::information(0,"",kz);
                    for (int v = 2; v < TempEditTable->row();v++){
                       // QMessageBox::information(0,"",TempEditTable->TableText(v,2)+" - "+kz);
                     if (TempEditTable->TableText(v,2) == kz){
                        matches = true;
                        for(int j = intColStart+4; j <= intColStart + intCols-1; j++) {
                            int cj =j-1;
                            QApplication::processEvents(QEventLoop::AllEvents,50000);
                            range = worksheet->querySubObject("Cells(int,int)", 1, j );
                            kz = range->property("Value").toString();

                            for (int v = j; v< TempEditTable->column();v++){
                                QApplication::processEvents(QEventLoop::AllEvents,50000);
                                if (TempEditTable->TableText(1,v) == kz){
                                   // QMessageBox::information(0,"Тест на равенство",TempEditTable->TableText(1,v)+" == "+kz);
                                    range = worksheet->querySubObject("Cells(int,int)", i, j );
                                    int value = range->property("Value").toInt();
                                     TempEditTable->edit = true;
                                     TempEditTable->SetTableText(i,j,QString::number(TempEditTable->TableText(i,j).toInt()+value));
                                      QApplication::processEvents(QEventLoop::AllEvents,50000);
                                   //  QMessageBox::information(0,"Есть совпадения",TempEditTable->TableText(i,j)+ " + "+QString::number(value));

                                }
                            }

                        }
                        // QMessageBox::information(0,"Есть совпадения",TempEditTable->TableText(v,2)+" - "+kz);

                     }
                 }
                 }
                 //continue;
                 if (!matches){
                     ui->tableWidget->insertRow(ui->tableWidget->rowCount());
                     for(int j = intColStart; j <= intColStart + intCols-1; j++) {
                        int cj =j-1;
                        QApplication::processEvents(QEventLoop::AllEvents,50000);
                        // Выделяю память под индекс и записываю туда значения
                        // Получаю ячейку с индексом i,j
                        range = worksheet->querySubObject("Cells(int,int)", i, j );
                        // Беру из ячейки значения
                       kz = range->property("Value").toString();
                        QTableWidgetItem *newItem = new QTableWidgetItem(kz);
                        ui->tableWidget->setItem( ui->tableWidget->rowCount()-1, cj, newItem);
                       // QMessageBox::information(0,"",QString::number(ci)+"x"+QString::number(cj));
                        QApplication::processEvents(QEventLoop::AllEvents,50000);
                    }
                     QApplication::processEvents(QEventLoop::AllEvents,50000);
                 }


             }


            // Закрываю Excel
            workbooks->dynamicCall("Close (Boolean)", false);
            excel->dynamicCall("Quit (void)");


    }


Тут было точно также, пока я не прописал QApplication::processEvents(QEventLoop::AllEvents,50000);

Потом все стало работать без проблем,

А в этой ситуации
Если я ставлю QApplication::processEvents(QEventLoop::AllEvents,50000);

То данные отправляются, но  все кроме первых...
Записан
CJ1
Гость
« Ответ #5 : Июнь 15, 2012, 18:02 »

Посмотрите люди, сделал, вот такой код
Цитировать
void import::on_pushButton_3_clicked()
{

    QApplication::processEvents();
    EditTable * TempEditTable=  (EditTable *)editwin;
    for (int i = 1; i < ui->tableWidget->rowCount(); i++){
        QApplication::processEvents();
        TempEditTable->addEndRow();
        QApplication::processEvents();
        TempEditTable->edit = true;
        for(int j = 0; j < ui->tableWidget->columnCount(); j++){
            QApplication::processEvents();
            for (int v = 1; v< TempEditTable->column();v++){
                QApplication::processEvents();
                for (int y =0; y < 1000; y++){
                    QApplication::processEvents();
                }
                //QMessageBox::information(0,"","");
                if (TempEditTable->TableText(1,v) == ui->tableWidget->item(0,j)->text()){
                    QApplication::processEvents();
                    QString value = ui->tableWidget->item(i,j)->text();
                    QApplication::processEvents();
                     TempEditTable->edit = true;
                     TempEditTable->SetTableText(TempEditTable->row()-1,v,value);
                     QApplication::processEvents();
                }
            }
        }
    }

    close();
}

Добавил
                for (int y =0; y < 1000; y++){
                    QApplication::processEvents();
                }

И все заработало!

Я понимаю что это через жопу, но скажите как сделать правильно?
Записан
CJ1
Гость
« Ответ #6 : Июнь 15, 2012, 19:17 »

Ладно, кто может сказать, как узнать, есть ли сообщения в очереди?
Записан
alexis031182
Гость
« Ответ #7 : Июнь 15, 2012, 20:15 »

Может быть так: QCoreApplication::hasPendingEvents()
Записан
alexis031182
Гость
« Ответ #8 : Июнь 15, 2012, 20:18 »

Ужас у Вас тут. Может лучше на сигналах/событиях сделать, если с потоками не хотите заморачиваться
Записан
CJ1
Гость
« Ответ #9 : Июнь 16, 2012, 09:01 »

Да ужас, это потому что щас пытался сделать, сделал, всем спасибо!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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