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正常工作
相关文章:
- Qt VTK交互风格的信号到小部件
- QT在错误的班级中寻找空位
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 如何在Qt窗口小部件中使用QStringView(或QStringRef)
- 如何在Qt C++中更改光标
- 如何在MS Visual Studio 2019中运行QT UI
- QT通过C++添加映射QML项目
- libssh 的函数在构建 libssh 时无法在 Qt 和 cmake 错误中找到
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 使用Qt C++计算类似Git的SHA1哈希
- Qt focusObjectChanged example?
- 编译boost时"threading=multi"究竟做了什么
- C++ Multi threading
- C++ Multi-threading?
- Qt Multi-Threading
- Armadillo + OpenBLAS multi-threading
- QT - multi-select
- QFuture Help, Threading C++ Qt
- Websphere MQ C++ Multi-threading