Название: QtConcurrent::run Debug error [РЕШЕНО]
Отправлено: UndeadDragon от Декабрь 16, 2012, 01:12
Всем привет! Есть функция генерации отчета, хотел запустить ее в отдельном потоке, и все бы ок, но вылетает куча ошибок идентичных такой: (http://s006.radikal.ru/i214/1212/ec/345dc5ed7b42.png) Только остальные с другими ресиверами. Если все пропустить, то в итоге сформируется нормальный отчет. Как быть? Судя по ошибке, ощущение, что что-то куда-то посылается во время выполнения потока, но в функции ничего такого нет. Как исправить или приглушить верещалку об ошибках? void FlowModel::reportParallel(){
QFuture<void> future = QtConcurrent::run(this,&FlowModel::reportIt); } void FlowModel::reportIt(){ //Генерация отчета QAxObject* WordApplication = new QAxObject("Word.Application"); if( WordApplication->isNull() ){ QMessageBox::warning(this,tr("Нету MS Word!"), tr("Внимание! На компьютере не установлен Microsoft Word или установлена версия Starter. Продолжение невозможно."), tr("Понял")); return; }
QVector<QVector<QPointF>> points = mainWidget->getPoints(); double Qc = mainWidget->getQc();
QAxObject* WordDocuments = WordApplication->querySubObject("Documents()"); QAxObject* NewDocument = WordDocuments->querySubObject("Add()"); QAxObject* ActiveDocument = WordApplication->querySubObject("ActiveDocument()"); QAxObject* Range = ActiveDocument->querySubObject("Range()"); Range->querySubObject("Font")->setProperty("Size", 18);
QString temp = tr("Моделирование процесса течения жидкости (%1)").arg(mainWidget->getMaterialName()) + "\n"; int range = temp.size();
Range->querySubObject("InsertAfter(QString)",temp); Range->querySubObject("InsertAfter(QString)",tr("\n")); Range = ActiveDocument->querySubObject("Range(QVariant&)", range); Range->querySubObject("Font")->setProperty("Size", 14);
temp = tr("Длина %1 м").arg(mainWidget->lLine->text()) + "\n"; Range->querySubObject("InsertAfter(QString)",temp); range += temp.size();
temp = tr("Ширина %1 м").arg(mainWidget->wLine->text()) + "\n"; Range->querySubObject("InsertAfter(QString)",temp); range += temp.size();
temp = tr("Глубина %1 м").arg(mainWidget->dLine->text()) + "\n"; Range->querySubObject("InsertAfter(QString)",temp); range += temp.size();
temp = tr("Скорость верхней крышки %1 м\с").arg(mainWidget->sLine->text()) + "\n"; Range->querySubObject("InsertAfter(QString)",temp); range += temp.size();
temp = tr("Температура верхней крышки %1 С").arg(mainWidget->tLine->text()) + "\n"; Range->querySubObject("InsertAfter(QString)",temp); range += temp.size();
QAxObject* Tables = ActiveDocument->querySubObject("Tables()"); Range = ActiveDocument->querySubObject("Range(QVariant&)", range); QAxObject* Table = Tables->querySubObject("Add(Range, NumRows, NumColumns, DefaultTableBehavior, AutoFitBehavior)", Range->asVariant(), points[0].size() + 1, 3, 1, 1);
temp = "z (0 <= z <= L)";
QAxObject* Cell = Table->querySubObject("Cell(Row, Column)", 1, 1); QAxObject* CellRange = Cell->querySubObject("Range()"); CellRange->dynamicCall("InsertAfter(Text)", temp);
range += temp.size();
delete CellRange; delete Cell;
temp = "Температура";
Cell = Table->querySubObject("Cell(Row, Column)", 1,2); CellRange = Cell->querySubObject("Range()"); CellRange->dynamicCall("InsertAfter(Text)", "Температура");
range += temp.size();
delete CellRange; delete Cell;
temp = "Вязкость";
Cell = Table->querySubObject("Cell(Row, Column)", 1,3); CellRange = Cell->querySubObject("Range()"); CellRange->dynamicCall("InsertAfter(Text)", "Вязкость");
range += temp.size();
delete CellRange; delete Cell;
for(int i = 0; i < points[0].size(); i++){ temp = QString("%1").arg(points[0][i].x(),0,'f',1);
Cell = Table->querySubObject("Cell(Row, Column)", i+2,1); CellRange = Cell->querySubObject("Range()"); CellRange->dynamicCall("InsertAfter(Text)", temp); range += temp.size(); temp = QString("%1").arg(points[0][i].y(),0,'f',2);
delete CellRange; delete Cell;
Cell = Table->querySubObject("Cell(Row, Column)", i+2,2); CellRange = Cell->querySubObject("Range()"); CellRange->dynamicCall("InsertAfter(Text)", temp);
range += temp.size(); temp = QString("%1").arg(points[1][i].y(),0,'f',1);
delete CellRange; delete Cell;
Cell = Table->querySubObject("Cell(Row, Column)", i+2,3); CellRange = Cell->querySubObject("Range()"); CellRange->dynamicCall("InsertAfter(Text)", QString("%1").arg(points[1][i].y(),0,'f',1));
range += temp.size() + 4;
delete CellRange; delete Cell;
}
Range->dynamicCall("InsertAfter(Text)","\n "); range += 5; QAxObject *newRange = ActiveDocument->querySubObject("Range(const QVariant&)", range); QAxObject *inlineShapes = newRange->querySubObject("InlineShapes()");
table->saveTempPlots(); QString lol = QCoreApplication::applicationFilePath() + "/temp1.png"; lol.replace("/MainModule.exe",""); inlineShapes->querySubObject("AddPicture(const QVariant&)", lol); temp = "Рис. 1 - Распределение температуры по длине канала\n\n"; newRange->dynamicCall("InsertAfter(Text)",temp);
range += temp.size() + 3;
lol = QCoreApplication::applicationFilePath() + "/temp2.png"; lol.replace("/MainModule.exe","");
newRange = ActiveDocument->querySubObject("Range(const QVariant&)", range); inlineShapes = newRange->querySubObject("InlineShapes()"); inlineShapes->querySubObject("AddPicture(const QVariant&)", lol); temp = "\nРис. 2 - Распределение вязкости по длине канала\n\n"; newRange->dynamicCall("InsertAfter(Text)",temp); range += temp.size();
newRange = ActiveDocument->querySubObject("Range(const QVariant&)", range); newRange->querySubObject("Font")->setProperty("Size",9); QDateTime curDate = QDateTime::currentDateTime(); newRange->querySubObject("InsertAfter(QString)",QString(tr("Отчет был создан %1 в программе %2©")). arg(curDate.toString()).arg("Chemical View"));
WordApplication->setProperty("Visible", true); delete newRange; delete inlineShapes; delete Range; delete Table; delete Tables; delete ActiveDocument; delete NewDocument; delete WordDocuments; delete WordApplication;
}
P.S. Не пугайтесь индийскому коду с активх, у меня там куча проблем было с получением рейджа, из-за его посимвольного контроля функция круто распухла.
Название: Re: QtConcurrent::run Debug error
Отправлено: mutineer от Декабрь 16, 2012, 10:46
reportIt работает в неGUI потоке, и ты оттуда делаешь прямые вызовы у виджетов. А с виджетами можно работать только в GUI потоке, отсюда и проблемы
Название: Re: QtConcurrent::run Debug error
Отправлено: UndeadDragon от Декабрь 16, 2012, 16:20
reportIt работает в неGUI потоке, и ты оттуда делаешь прямые вызовы у виджетов. А с виджетами можно работать только в GUI потоке, отсюда и проблемы
Хм, ок, но ведь все работает в итоге, не совсем понимаю тогда смысл дебаг ошибок. Может просто заткнуть можно как-нибудь?
Название: Re: QtConcurrent::run Debug error
Отправлено: mutineer от Декабрь 16, 2012, 17:41
Лучше следовать рекомендациям создателя фреймворка - ибо сейчас работает, а шаг влево и не сработает. Не зря же правила существуют
Название: Re: QtConcurrent::run Debug error
Отправлено: UndeadDragon от Декабрь 16, 2012, 17:50
Лучше следовать рекомендациям создателя фреймворка - ибо сейчас работает, а шаг влево и не сработает. Не зря же правила существуют
Ок, у меня вообще нет выхода тут? Просто этот отчет генерируется на слабых машинах, из-за активх, очень долго, вплоть до 10-13с. Естественно, что программа на это время виснет. Вот я и хотел использовать поток по его прямому назначению. Но опыта у меня в этом деле нема =\
Название: Re: QtConcurrent::run Debug error
Отправлено: mutineer от Декабрь 16, 2012, 18:02
есть выход, конечно. Всю работу с виджетами оставляешь в главном потоке, а с ActiveX работаешь в отельном (вроде он может в любом потоке жить)
Название: Re: QtConcurrent::run Debug error
Отправлено: UndeadDragon от Декабрь 16, 2012, 22:26
есть выход, конечно. Всю работу с виджетами оставляешь в главном потоке, а с ActiveX работаешь в отельном (вроде он может в любом потоке жить)
Спасибо. Потестировал так и сяк, покрутил, сделал вывод - нельзя производить манипуляции именно с видимыми данными, как-то так. Манипуляции с данными виджетов вроде получения / изменения точек прошли нормально. В общем вынес все проблемное из функции стало работать без ошибок, ActiveX нормально работает тоже. Спасибо за помощь.
|