5.8 KiB
5.8 KiB
Асинхронный парсинг файлов
Обзор
Добавлена поддержка асинхронного парсинга файлов через QFuture и QtConcurrent, что позволяет не блокировать GUI во время обработки больших файлов.
Преимущества асинхронного парсинга
✅ Не блокирует GUI
- Интерфейс остается отзывчивым во время парсинга
- Пользователь может продолжать работу с приложением
- Прогресс-бар показывает ход выполнения
✅ Отмена парсинга
- Возможность отменить парсинг в любой момент
- Освобождение ресурсов при отмене
- Безопасное завершение операций
✅ Обработка больших файлов
- Эффективная обработка файлов любого размера
- Не зависает при парсинге сложных проектов
- Прогрессивная загрузка данных
Реализация
AltiumParser
Файл: controller/altiumparser.h
Добавленные методы:
// Асинхронный парсинг
bool parseFileAsync(const QString &filename, ComponentModel *model);
bool isParsingAsync() const;
void cancelParsing();
Приватные члены:
QFutureWatcher<bool> *m_parseWatcher;
bool m_isParsingAsync;
MainController
Файл: controller/maincontroller.h
Добавленные методы:
bool parseFileAsync(const QString &filePath);
bool isParsingAsync() const;
void cancelParsing();
Использование
Синхронный парсинг (блокирует GUI)
bool success = controller.parseFile("project.PrjPcb");
if (success) {
qDebug() << "Парсинг завершен";
}
Асинхронный парсинг (не блокирует GUI)
// Подключаем сигналы
connect(&controller, &MainController::parsingProgress,
[](int progress) { qDebug() << "Прогресс:" << progress << "%"; });
connect(&controller, &MainController::parsingFinished,
[](bool success) { qDebug() << "Завершено:" << success; });
// Запускаем асинхронный парсинг
bool started = controller.parseFileAsync("project.PrjPcb");
// Проверяем статус
if (controller.isParsingAsync()) {
qDebug() << "Парсинг выполняется...";
}
// При необходимости отменяем
controller.cancelParsing();
Сигналы и слоты
Сигналы парсера:
parsingProgress(int percentage)- прогресс парсингаparsingFinished(bool success)- завершение парсингаparsingError(const QString &error)- ошибка парсинга
Обработка в GUI:
// В MainWindow или другом виджете
connect(m_controller, &MainController::parsingProgress,
this, &MainWindow::updateProgressBar);
connect(m_controller, &MainController::parsingFinished,
this, &MainWindow::onParsingFinished);
connect(m_controller, &MainController::parsingError,
this, &MainWindow::showError);
Рекомендации
Когда использовать асинхронный парсинг:
- Большие файлы - проекты с множеством компонентов
- Сложные проекты - с множественными вариантами
- Интерактивные приложения - где важна отзывчивость GUI
- Длительные операции - парсинг занимает более 1-2 секунд
Когда использовать синхронный парсинг:
- Маленькие файлы - простые проекты
- Тестирование - для отладки и тестов
- Простые операции - где блокировка GUI не критична
Пример интеграции
class ProjectManager : public QObject
{
Q_OBJECT
public:
void parseProject(const QString &filePath) {
if (m_controller.isParsingAsync()) {
qDebug() << "Парсинг уже выполняется";
return;
}
// Запускаем асинхронный парсинг
m_controller.parseFileAsync(filePath);
}
void cancelParsing() {
m_controller.cancelParsing();
}
private slots:
void onParsingProgress(int progress) {
// Обновляем прогресс-бар
m_progressBar->setValue(progress);
}
void onParsingFinished(bool success) {
if (success) {
// Загружаем данные из БД
m_controller.loadComponentsFromDatabase();
m_controller.loadProjectParamsFromDatabase();
// Обновляем интерфейс
updateView();
} else {
// Показываем ошибку
showError("Ошибка парсинга");
}
}
private:
MainController m_controller;
QProgressBar *m_progressBar;
};
Заключение
Асинхронный парсинг обеспечивает:
- ✅ Отзывчивый интерфейс
- ✅ Возможность отмены операций
- ✅ Эффективную обработку больших файлов
- ✅ Прогрессивную загрузку данных
- ✅ Безопасное завершение операций