子线程内读取文件
void listWidgetAdd::addItem(QFile *currentFile)
{
if(!currentFile->isOpen()){
return;
}
readResult.clear();
QString line = currentFile->readLine();
readResult.append(line);
int i = 1;
while (i<100) {
i++;
line = currentFile->readLine();
if(line.isNull()){
currentFile->close();
break;
}else {
readResult.append(line);
}
}
// while (!currentFile->atEnd()) {
// QString line = currentFile->readLine();
// readResult.append(line);
// }
// currentFile->close();
emit appendText();
}
将读取的内容添加进QTextEdit内
```c++
void printPage::TextEditAppend()
{
for (int i=0;i<readResult.size();i++) {
ui->listWid_gcode->append(readResult.at(i).trimmed());
}
qDebug()<<"append";
emit readFile(currentFile);
}
这个控件应该是不能一次性加载太大的数据,会卡死的,另外也还有内存大小的限制。建议设置控件一次性显示的数据大小或行数,然后进行分页缓存显示。
http://t.csdn.cn/VwVRd
CreateFileMapping
提供参考链接:https://blog.csdn.net/qq_45236230/article/details/105592423
一次性加载几百MB数据是不现实的,就算能完成加载人眼也看不到那么多内容,内存占用高内容滚动可能也比较卡顿。
最好的办法是分段式加载,比如一次性最大加载50MB内容。根据滚动条来进行分页动态加载。当然这样处理起来就要比单次加载稍显麻烦一些。
你这里崩溃的原因其实是由于listWidgetAdd::addItem()和printPage::TextEditAppend()这两个函数形成递归调用,如果文件太大,那么递归调用层次太多就会导致运行栈溢出,从而程序崩溃。
你的代码产生递归调用是因为你连接signal和slot的方式不对,默认connect方式是Qt::AutoConnection,即发生者和接收者都在同一线程时用Qt::DirectConnection,否则用Qt::QueuedConnection,而你这里需要改为Qt::QueuedConnection,就可以消除递归调用。
connect(..., &listWidgetAdd::appendText, ..., &printPage::TextEditAppend, Qt::QueuedConnection);
connect(..., &printPage::readFile, ..., &listWidgetAdd::addItem, Qt::QueuedConnection);
ui.textEdit->document()->setMaximumBlockCount(1000); //设置最大行数就好了