Проблемы при работе с QThread Qt
Пишу программу на С++, используя Qt. Задача: Пользователь может указать директорию, которая состоит из других папок, а внутри этих папок находятся файлы. Необходимо заархивировать папки с файлом и поместить архивы в другую директорию. Я работаю с дополнительным потоком для обработки (создал класс Worker и т.п.). Все делал по примеру из документации Qt. Проблема следующая: На моем компьютере и на компьютерах с Windows 10 все работает. Но на компьютерах с Windows 7 после обработки одной большой папки программа крашится. Ошибка: Программа не работает, код 0xc0000005. Что делать? Это проблема в коде или нужно что-то установить дополнительно? Net Framework, Visual C++ и т.п. обновлял, но ничего не помогло. Код программы прилагаю.
P.S. Если не использовать дополнительный поток, то все работает корректно. Но дополнительный поток нужен, чтобы можно было отображать прогресс обработки, то есть сколько каталогов обработано
#include "renamewidget.h"
#include "ui_renamewidget.h"
#include <private/qzipwriter_p.h>
QString RenameWidget::filePath; //static field
QString RenameWidget::directoryPath; //static field
QString RenameWidget::resultPath; //static field
RenameWidget::RenameWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::RenameWidget)
{
ui->setupUi(this);
filePath = "C:/Users/user/Desktop/1.xlsx";
directoryPath = "C:/Users/user/Desktop/2";
resultPath = "C:/Users/user/Desktop/3";
connect(this, &RenameWidget::doWork, &worker, &Worker::doWork);
connect(&worker, &Worker::workProgress, this, &RenameWidget::setText);
worker.moveToThread(&thread);
thread.start();
}
void RenameWidget::setText(QString message)
{
ui->lableLoad->setText(message); // setProgress
}
void RenameWidget::on_pb_Rename_clicked()
{
emit doWork();
}
void Worker::doWork()
{
emit workProgress("");
QDir dir;
dir.setPath(RenameWidget::getDirectoryPath());
QStringList listDir = dir.entryList(QDir::Dirs | QDir::NoDot | QDir::NoDotDot);
for (int i = 0; i<listDir.size();i++)
{
QString article = QString::number(i);
dir.setPath(RenameWidget::getDirectoryPath() + "/" + listDir.at(i));
QStringList tempstr = dir.entryList(QDir::Dirs | QDir::NoDot | QDir::NoDotDot);
QString temppath = RenameWidget::getDirectoryPath() + "/" + listDir.at(i) + "/" + tempstr .at(0);
QString tempres = RenameWidget::getResultPath() + "/" + "archives" + "/" + article;
dir.mkpath(tempres);
doArchive(temppath + "/", tempres + "/" + article + ".zip");
emit workProgress("Обработано каталогов: " + QString::number(i+1) + "/" + QString::number(listDir.size()));
}
emit workProgress("Готово");
}
void Worker::doArchive(QString path, QString zippath)
{
QZipWriter zip(zippath);
zip.setCompressionPolicy(QZipWriter::AutoCompress);
QDirIterator it(path, QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot, QDirIterator::Subdirectories);
while (it.hasNext())
{
QString file_path = it.next();
if (it.fileInfo().isFile())
{
QFile file(file_path);
if (!file.open(QIODevice::ReadOnly))
continue;
zip.setCreationPermissions(QFile::permissions(file_path));
QByteArray ba = file.readAll();
zip.addFile(file_path.remove(path), ba);
}
}
zip.close();
}