namespace Ui{ class MainWindow;}//#pragma pack (push,1)class MainWindow : public QMainWindow{ Q_OBJECTpublic: MainWindow(QWidget *parent = 0); ~MainWindow();public slots: void openInputFile();private: Ui::MainWindow *ui; MathThread mathThread; QProgressBar *prBar; QList<SEND> list;};
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow){ ui->setupUi(this); prBar = new QProgressBar(); connect(ui->actionOpen,SIGNAL(triggered()),this,SLOT(openInputFile())); connect(&mathThread,SIGNAL(startProcess()),prBar,SLOT(show())); connect(&mathThread,SIGNAL(maximum(int)),prBar,SLOT(setMaximum(int))); connect(&mathThread,SIGNAL(increase(int)),prBar,SLOT(setValue(int))); connect(&mathThread,SIGNAL(finishProcess()),prBar,SLOT(hide()));}MainWindow::~MainWindow(){ delete ui;}void MainWindow::openInputFile(){ mathThread.setReadSourceFileMode(); mathThread.setFileName(QFileDialog::getOpenFileName(this,"OpenFile Dialog",0,"*.mki")); prBar->move(pos().x()+(width() - prBar->width())/2,pos().y()+(height() - prBar->height())/2); mathThread.start();}
class MathThread : public QThread{ Q_OBJECTpublic: MathThread(); void setReadSourceFileMode();//Установить режим чтения исходного файла void setMathListMode(); //Установить режим работы со структурой Data результаты заносятся в list void setWriteWorkFileMode(); //Установить режим записи в файл узлов list void setFileName(QString str); //Установить имя входного/выходного файла QList<SEND> *getWorkList(); //Передать *list в место вызова QList<SEND> *getSourceList(); //Передать *list в место вызова QList<Rez_29_A> *getList_29(); //Передать *list в место вызова QString& getSourceFileName(); QList<QPoint> arrayOfModa; friend int SendData(int Regim); friend int ReadData(FILE *ReadFil); bool atOnce;signals: void error(QString); //Сигналы ошибок void message(QString); void maximum(int); void increase(int); void startProcess(); void finishProcess(); void finishMath();protected: void run(); //Главная функция потокаprivate: QList<SEND> *workList,*sourceList; QList<Rez_29_A> *list_29; QFile file; QString fileName; enum Mode {ReadSourceFile,MathList,WriteWorkFile} mode;};
MathThread::MathThread(){ sourceList = new QList<SEND>; list_29 = new QList<Rez_29_A>;}void MathThread::run(){ switch(mode) { case ReadSourceFile: emit startProcess(); file.setFileName(fileName); if (!file.open(QIODevice::ReadOnly)) { emit error(tr("Cannot read file %1:\n%2.") .arg(file.fileName()) .arg(file.errorString())); } else { sourceList->clear(); QByteArray CMD = file.peek(2); if(CMD.toInt() != 8) { emit maximum(file.size()/sizeof(Rez_10_A2)); while(!file.atEnd()) { sourceList->append(*(SEND *) file.read(sizeof(Rez_10_A2)).data()); if(sourceList->count()%1000 == 0) emit increase(sourceList->count()); } file.close(); emit message(QString("sourceList has %1 elements").arg(QString::number(sourceList->count()))); list_29->clear(); QString str = fileName; str.chop(4); str += "_29.mki"; file.setFileName(str); if (!file.open(QIODevice::ReadOnly)) { emit error(tr("Cannot read file %1:\n%2.") .arg(file.fileName()) .arg(file.errorString())); } else { emit maximum(file.size()/sizeof(Rez_29_A)); while (!file.atEnd()) { list_29->append(*(Rez_29_A *) file.read(sizeof(Rez_29_A)).data()); if (list_29->count()%1000 == 0) emit increase(list_29->count()); } emit message(QString("list of termo has %1 elements from %2").arg(QString::number(list_29->count()),str)); } } else { emit maximum(file.size()/sizeof(Rez_8_A2)); while (!file.atEnd()) { workList->append(*(SEND *) file.read(sizeof(Rez_8_A2)).data()); if(workList->count()%1000 == 0) emit increase(workList->count()); } emit error("File of 8 regim was reading"); emit finishMath(); } file.close(); //emit message(QString("We get %1 bad massages").arg(QString::number(badData))); } emit finishProcess(); break; }}