Название: Проблема Отправлено: CJ1 от Июнь 15, 2012, 16:41 Люди, объясните мне пожалуйста одну вещь, у меня какаето хрень в проге творится
Даже не знаю как описать! Но Почемуто не выполняются некоторые сообщения. А точнее, не отправляются данные по сокету. У меня куча циклов. Вот код Код: void import::on_pushButton_3_clicked() Я то понимаю, что в очереди сообщений остается куча этих сообщений. И чтоб сообщения прошли, нужно пользоваться QApplication::processEvents(); Но я их между кодом, кучу наставил, и всеравно косяки лезут! Тоесть данные по сокетам не всегда отправляются... Низнаю как еще это вырозить. Но если я проставлю между каждой строчкой кода QMessageBox то все работает отлично! Помогите решить эту беду, У меня куча слотов своих, и очень много данных по сокетам бегают, И очень большие циклы Название: Re: Проблема Отправлено: Alex Custov от Июнь 15, 2012, 16:57 какой-то код заполняет какую-то таблицу, не видно никаких сокетов и отправки каких-либо данных
Название: Re: Проблема Отправлено: CJ1 от Июнь 15, 2012, 17:01 Да хотябы вот!!!
Код: void EditTable::on_tableWidget_cellChanged(int row, int column) qDebug() все показывает, а сокет неотправляет данные!!!! Но если я в том коде наставлю в промежутках QMessageBox то все работает! Название: Re: Проблема Отправлено: Alex Custov от Июнь 15, 2012, 17:05 проверь хотя бы код возврата из _sock->write() и выведи на консоль _sock->errorString()
Название: Re: Проблема Отправлено: CJ1 от Июнь 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); То данные отправляются, но все кроме первых... Название: Re: Проблема Отправлено: CJ1 от Июнь 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(); } И все заработало! Я понимаю что это через жопу, но скажите как сделать правильно? Название: Re: Проблема Отправлено: CJ1 от Июнь 15, 2012, 19:17 Ладно, кто может сказать, как узнать, есть ли сообщения в очереди?
Название: Re: Проблема Отправлено: alexis031182 от Июнь 15, 2012, 20:15 Может быть так: QCoreApplication::hasPendingEvents()
Название: Re: Проблема Отправлено: alexis031182 от Июнь 15, 2012, 20:18 Ужас у Вас тут. Может лучше на сигналах/событиях сделать, если с потоками не хотите заморачиваться
Название: Re: Проблема Отправлено: CJ1 от Июнь 16, 2012, 09:01 Да ужас, это потому что щас пытался сделать, сделал, всем спасибо!
|