Qt Multi-Threading - PullRequest
       6

Qt Multi-Threading

0 голосов
/ 21 декабря 2011

Я пытаюсь читать данные из текстовых файлов и сохранять токены в базе данных SQLite, работающей в Windows. Размер файлов составляет около 300 МБ, дело в том, что я пока не использую потоки, приложение сворачивается и застревает с сообщением «не отвечает» вот мой код

QDir dir(ui->lineEdit->text());
if(dir.exists() && ui->lineEdit->text()!=""){
    CreateTables();

    dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks);
    dir.setSorting(QDir::Size | QDir::Reversed);

    QFileInfoList list = dir.entryInfoList();
    for (int i = 0; i < list.size(); ++i)  {
        QFileInfo fileInfo = list.at(i);
        QFile file(ui->lineEdit->text()+"/"+ fileInfo.fileName());

        if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
            QSqlQuery qrry;
            qrry.prepare( "INSERT INTO documents (path) VALUES ('"+ui->lineEdit->text()+"/"+ fileInfo.fileName()+"')" );
            qrry.exec();

            QString line;
            QTextStream in(&file);
            int lineCount=0;
            while (!in.atEnd()) {

                line = in.readLine();
                lineCount++;
                QRegExp rx("(\\ |\\,|\\.|\\:|\\t)"); 
                QStringList line_tokens = line.split(rx);

                for(int i=0;i<line_tokens.length();i++){
                    if(line_tokens[i].length()>3){
                        QSqlQuery qry;
                        qry.prepare( "INSERT INTO tokens (token,path,line) VALUES ('"+line_tokens[i]+"', '"+ui->lineEdit->text()+"/"+ fileInfo.fileName()+"','"+QString::number(lineCount)+"')" );
                        qry.exec();
                    }
                }
            }
        }
        else{
            QMessageBox::information(this,"File Read Error","Couldn't Open File, Please Make Sure That This File Is Accessable And Readable !");
        }
        std::cout << std::endl;
    }
}
else{
    QMessageBox::critical(this,"Directory choosen is Not Valid","Please Make Sure That You Have Choosen A Valid Directory!");
}

это работает для файлов небольшого размера, но когда дело доходит до огромного количества данных, оно выдает сообщение "не отвечает"

будут ли потоки спасать приложение от свертывания ?? и как я могу реализовать потоки для выполнения этой работы для более чем 20 файлов по 15 МБ каждый

Ответы [ 2 ]

1 голос
/ 21 декабря 2011

Сначала , вы можете просто ... подождать, пока он обработает все данные.Если вы должны запустить эту программу только один раз, это нормально.

Тогда вы не должны генерировать такой поток запросов к базе данных.Намного лучше запустить одну большую вставку, чем много маленьких.Вы можете использовать batch выполнение.

Тогда, вероятно, нет смысла пытаться выполнять параллельную запись в Db.Я думаю, он достаточно умен, чтобы эффективно писать.

Но это стоит распараллелить анализ.Лучшее решение здесь - это использование QtConcurrent framework.Это сделано именно для таких задач.

0 голосов
/ 02 февраля 2012

Это идеальная ситуация, когда вы хотите использовать потоки. Потоки будут выполнять всю работу в фоновом режиме, и, хотя обработка данных по-прежнему будет занимать время, графический интерфейс пользователя не будет зависать или не отвечать.

Я не совсем понимаю ваше приложение, но вы могли бы написать один поток, который выполняет всю эту интенсивную работу процессора, или даже два потока, один для чтения файла, а другой для базы данных, но два потока требуют больших усилий для реализации. Сначала я предложу придерживаться одной темы, так как это проще.

Вы определенно хотите использовать потоки здесь, это решит ваше приложение, не отвечающее на сообщение, которое часто люди интерпретируют как «оно свернуто» или «зависло», в то время как основной поток приложения слишком занят, лишая GUI для нормальной работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...