Название: Excel как жрёт ОП Отправлено: iei-nn от Октябрь 19, 2010, 17:56 Доброго времени суток я новичок в QT не стоит обрушивать на меня тонны критики.
Вообщем проблема то можно сказать тривиальная только вот ни как решить не могу. Есть программка лезет она в папку по указанному пути смотри там Excel-ые файлики берёт каждый открывает его читает от туда заданный диапазон и по ИДЕЕ закрывает! Штука вся в том что она либо не закрывает либо закрывает но не всё. в итоге в диспетчере наблюдается процесс EXCEL.exe только размером он в ОП где то под 150 метров. Меня сначала и процесс самой программы беспокоил но оказалось что на самом деле всё нормально это Windows немножко не корректно показывает. Код: QString fileName; QString bufstr; QAxObject* excel = new QAxObject( "Excel.Application" ); //получаем указатьтель на excel workbooks = excel->querySubObject("WorkBooks"); QDir dir("C:\\s\\s\\"); dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks); dir.setSorting(QDir::Size | QDir::Reversed); QFileInfoList list = dir.entryInfoList(); ui->progressBar->setRange(0,list.size()); // std::cout << " Bytes Filename" << std::endl; for (int i = 0; i < list.size(); ++i) { fileInfo = list.at(i); QString zapis=" "; if (fileInfo.suffix()=="xls" or fileInfo.suffix()== "xlsx"){ fileName=fileInfo.fileName(); QString pathfile="C:\\s\\s\\"+fileName; workbooks->dynamicCall("Open (const QString&)", QString(pathfile)); int intCount = excel->querySubObject("ActiveWorkBook")->querySubObject("WorkSheets")->property("Count").toInt(); workbook = excel->querySubObject("ActiveWorkBook"); worksheet = workbook->querySubObject("Worksheets(int)", 1)->querySubObject("UsedRange"); usedrange = excel->querySubObject("ActiveWorkBook")->querySubObject("Worksheets(int)", 1)->querySubObject("UsedRange"); rows = usedrange->querySubObject("Rows"); columns = usedrange->querySubObject("Columns"); int intCols = columns->property("Count").toInt(); int intRows = rows->property("Count").toInt(); zapis=""+fileName+'\n'; ui->label->setText(fileName); ui->progressBar_2->setRange(0,intRows-8); ui->progressBar_2->setValue(0); for (int rows = 8; rows <= intRows; ++rows){ for (int Cols = 1; Cols <= intCols; ++Cols){ cell=usedrange->querySubObject("Cells(int, int)",rows,Cols ); value = cell->dynamicCall( "Value()" ); zapis=zapis+value.toString()+" "; } zapis=zapis+"\n"; ui->progressBar_2->setValue(rows-8); } ui->textEdit->setPlainText(zapis); ui->progressBar->setValue(i); workbooks->dynamicCall("Close()"); excel->dynamicCall("Quit()"); excel->dynamicCall("Close()"); } } Заранее благодарю! Название: Re: Excel как жрёт ОП Отправлено: iei-nn от Октябрь 20, 2010, 14:49 Народ ну помогите когда несколько Excel файлов по 4000 записей умирает на проч все а так не хачется :-(
Название: Re: Excel как жрёт ОП Отправлено: iei-nn от Октябрь 22, 2010, 04:10 Очень жаль что эта тема превращается в монолог, но не смотря на это все же я продолжил исследовать этот вопрос.
Самым главным оружием исследователя НАБЛЮДЕНИЕ, было выяснено, что при выполнение вот этого кода: Код: cell=usedrange->querySubObject("Cells(int, int)",rows,Cols ); Следовательно вопрос !!! Какого я извиняюсь это происходит ведь тут объект ячейка присваивается cell а потом посылается команда на получение значения ячейки. получается так, что ячейка когда ActiveX получает команду Cells(int, int) заново записывается в ОП. ЧТО ЗА ХРЕНЬ ??????? Возможно мои предположения расходятся с действительностью, но что эти 2 строки вызывают увеличение памяти которое занимает процесс Ecxel.exe это факт!!!!!! P/S "Неужели ни кто не знает и не может объяснить? ???" |