Qt多线程

时间:2011-12-21 17:18:41

标签: c++ qt

我正在尝试从文本文件中读取数据并在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的文件更多

2 个答案:

答案 0 :(得分:1)

首先,您可以简单地......等待它处理所有数据。如果你只应该运行一次这个程序,那就没关系了。

然后,您不应该生成这样的数据库请求流。运行一次大插入比使用很多小插件要好得多。您可以使用batch执行。

然后,它可能没有理由尝试并行写入Db。我认为,它足够聪明,可以有效地管理写作。

但它值得并行分析。这里最好的解决方案是使用QtConcurrent框架。它完全是为了完成这些任务。

答案 1 :(得分:0)

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

我并不完全了解您的应用程序,但您可以编写单个线程来执行所有这些处理器密集型工作,甚至可以编写两个线程来读取文件,另一个线程用于数据库,但是两个线程需要更多的工作才能实现。我会建议首先坚持使用一个线程,因为它更简单。

你肯定想在这里使用线程,它会解决你的应用程序没有响应的消息,通常人们将其解释为“崩溃”或“挂起”而应用程序主线程太忙,导致GUI无法正常运行。