c++ - Qt 多线程

标签 c++ qt

我正在尝试从文本文件中读取数据并将 token 保存在 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!");
}

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

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

最佳答案

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

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

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

但值得并行解析。这里最好的解决方案是使用 QtConcurrent 框架。它正是为此类任务而设计的。

关于c++ - Qt 多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8593719/

相关文章:

c++ - 删除调用析构函数

c++ - 使用 QSqlQuery 检索 MySQL 存储过程的输出

c++ - 如何安装和运行 QtOpenCl 的示例,即 OpenCl 中的 Qt?

php - 我想问你应该如何看待这段代码到 C++

c++ - 有人可以向我解释一下这段代码的作用吗?

c++ - 在c++中模拟基本字符串的使用

c++ - typedef void FOO 与 #define FOO void 在函数签名中的含义

Windows 上的 QT 自动启动应用程序

qt - 为什么麦克风关闭时基本频率和幅度不为零?

linux - SSH 协议(protocol)错误 : Server and client capabilities don't match