Страницы

Поиск по вопросам

пятница, 14 февраля 2020 г.

Почему программа не отвечает, когда копирую большой объём файлов?

#cpp #qt #файлы


Программа перестаёт реагировать, после того как я начинаю копировать файлы и нажимаю
на неё хоть один раз. Как избежать этого?

Мой код:

void MainWindow::SaveFiles()
{
    if (!ComboBoxLog->currentData().isNull()) {
        SaveFilesButton->setDisabled(true);
        Progress->show();
        Progress->setMinimum(0);
        Progress->setMaximum(model->rowCount()-1);
        Login conn;
        conn.connOpen();
        QSqlQuery* queryAddNote = new QSqlQuery(conn.mydb);

        QString newDir = "";

        for (int i=1;irowCount();i++) {
            newDir = QString(QDir::currentPath()+"/"+ComboBoxLog->currentText()+"_%1"+"/"+model->index(i,2).data().toString()).arg(QString(QDate::currentDate().toString()).replace("
","_"));
            if (QDir(newDir).exists() == false) {
                QDir().mkpath(newDir);
            }
            if (model->index(i,0).data(Qt::DisplayRole).toBool()==true) {

                    QFile::copy(model->index(i,1).data().toString(),newDir+"/"+QFileInfo(model->index(i,1).data().toString()).fileName());
                    QString sqlQueryAddNote = QString("INSERT INTO data (data,path_to_data,id_log,date_add_log)
VALUES ('%1','%2','%3','%4')")
                            .arg(QFileInfo(model->index(i,1).data().toString()).fileName())
                            .arg(newDir+"/"+QFileInfo(model->index(i,1).data().toString()).fileName())
                            .arg(ComboBoxLog->currentData().toString())
                            .arg(QDate::currentDate().toString());
                    queryAddNote->prepare(sqlQueryAddNote);
                    qDebug()<lastError();
                    queryAddNote->exec();

                Progress->setValue(i);
            } else {

            }
        }
        conn.connClose();
        Progress->hide();
        model->clear();
        SaveFilesButton->setDisabled(false);
        TableDisk->setModel(nullptr);        
        MainWindow::TableLogBuilding();
        MainTab->setCurrentIndex(1);

    } else {
        msgBox.setText("Выберите журнал в ComboBox! Обязательное поле.");
        msgBox.exec();
        return;
    }
    return;
}

    


Ответы

Ответ 1



Дело в том, что вы полностью загружаете поток самой формы, и поэтому ее элементы не отвечают: уже идет сохранение файлов. По сути, строение такого приложение весьма примитивно, и в одно и то же время вы можете выполнять лишь один процесс. Поэтому используйте такую вещь, как QThread: он предназначен для создания дополнительных потоков, которые не будут мешать работе формы. PS. На Хабре пишут, что документация в Qt по данному элементу неправильная. Но все равно посмотрите тут и тут.

Комментариев нет:

Отправить комментарий