我正在尝试从文本文件中读取数据并在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的文件更多
答案 0 :(得分:1)
首先,您可以简单地......等待它处理所有数据。如果你只应该运行一次这个程序,那就没关系了。
然后,您不应该生成这样的数据库请求流。运行一次大插入比使用很多小插件要好得多。您可以使用batch
执行。
然后,它可能没有理由尝试并行写入Db。我认为,它足够聪明,可以有效地管理写作。
但它值得并行分析。这里最好的解决方案是使用QtConcurrent
框架。它完全是为了完成这些任务。
答案 1 :(得分:0)
这是您想要使用线程的理想情况。线程将在后台完成所有工作,虽然它仍然需要时间来处理数据,但您的GUI不会显示被挂起或没有响应。
我并不完全了解您的应用程序,但您可以编写单个线程来执行所有这些处理器密集型工作,甚至可以编写两个线程来读取文件,另一个线程用于数据库,但是两个线程需要更多的工作才能实现。我会建议首先坚持使用一个线程,因为它更简单。
你肯定想在这里使用线程,它会解决你的应用程序没有响应的消息,通常人们将其解释为“崩溃”或“挂起”而应用程序主线程太忙,导致GUI无法正常运行。