Qt Multi-Threading

Qt Multi-Threading

本文关键字:Multi-Threading Qt      更新时间:2023-10-16

我正在尝试从文本文件中读取数据,并在windows上运行的SQLite数据库中保存令牌文件大小约为300MB,问题是我还没有使用线程,应用程序崩溃并显示"未响应"消息这是我的代码

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!");
}

它适用于小文件大小,但当涉及到大量数据时,它会给出"未响应"消息

线程会使应用程序免于崩溃吗??以及我如何实现线程来为每个15 MB的20多个文件完成这项工作

首先,您可以简单地…等到它处理完所有的数据。如果你只运行这个程序一次,它是可以的。

那么,您不应该生成这样的请求流到数据库。运行单个大插入比运行大量小插入要好得多。您可以使用batch执行

那么,可能没有理由尝试并行写Db。我认为,有效地管理写作是足够聪明的。

但是值得并行解析。这里最好的解决方案是使用QtConcurrent框架。

这是您希望使用线程的理想情况。线程将在后台完成所有的工作,虽然它仍然需要时间来处理数据,但您的GUI不会出现挂起或不响应。

我不完全理解你的应用程序,但是你可以写一个线程来完成所有这些处理器密集型的工作,或者甚至两个线程,一个读取文件,另一个读取数据库,但是两个线程需要更大的努力来实现。我建议先用一条线,因为它更简单。

你肯定想在这里使用线程,它将解决你的应用程序不响应消息,通常人们解释为"它崩溃"或"挂起",而应用程序主线程只是太忙剥夺GUI正常工作