6.1 KiB
6.1 KiB
Исправления асинхронного парсинга
Проблемы, которые были исправлены
1. ✅ Сигнал parsingStarted не пробрасывался до MainWindow
Проблема: Сигнал parsingStarted не был добавлен в AltiumParser, поэтому MainWindow не знал о начале парсинга.
Исправление:
- Добавлен сигнал
parsingStarted()вAltiumParser - Подключен сигнал в
MainController - MainWindow теперь получает уведомление о начале парсинга
Код:
// В altiumparser.h
signals:
void parsingStarted(); // ← ДОБАВЛЕНО
void parsingProgress(int percentage);
void parsingFinished(bool success);
void parsingError(const QString &error);
// В altiumparser.cpp
bool AltiumParser::parseFileAsync(const QString &filename, ComponentModel *model)
{
// ...
emit parsingStarted(); // ← ДОБАВЛЕНО
emit parsingProgress(0);
// ...
}
// В maincontroller.cpp
connect(m_altiumParser, &AltiumParser::parsingStarted,
this, &MainController::parsingStarted); // ← ДОБАВЛЕНО
2. ✅ Неравномерные проценты прогресса
Проблема: Прогресс обновлялся только каждые 1000 строк, что создавало неравномерные скачки.
Исправление:
- Добавлен предварительный подсчет строк в файле
- Прогресс теперь рассчитывается на основе реального количества строк
- Более равномерное обновление прогресса
Код:
// Предварительный подсчет строк
QFile countFile(filename);
countFile.open(QIODevice::ReadOnly | QIODevice::Text);
QTextStream countReader(&countFile);
countReader.setCodec(QTextCodec::codecForName("Windows-1251"));
int totalLines = 0;
while (!countReader.atEnd()) {
countReader.readLine();
totalLines++;
}
countFile.close();
// Равномерный прогресс
int currentProgress = (lineCount * 80) / totalLines; // 80% для парсинга
if (currentProgress > lastProgress) {
emit parsingProgress(currentProgress);
lastProgress = currentProgress;
}
3. ✅ Улучшенный прогресс-бар для сохранения в БД
Проблема: Сохранение в базу данных не показывало прогресс.
Исправление:
- Добавлены этапы прогресса для сохранения в БД
- 80-85% - сохранение вариантов
- 85-90% - сохранение компонентов
- 90-95% - сохранение вариативных свойств
- 95-100% - сохранение параметров проекта
Код:
void AltiumParser::saveDataToDatabase(const ProjectData &data)
{
// Сначала создаем варианты в БД (80-85%)
emit parsingProgress(80);
saveVariantsToDatabase(data);
// Сохраняем обычные компоненты (85-90%)
emit parsingProgress(85);
saveRegularComponents(data);
// Сохраняем вариативные свойства (90-95%)
emit parsingProgress(90);
saveVariantProperties(data);
// Сохраняем параметры проекта (95-100%)
emit parsingProgress(95);
saveProjectParameters(data);
emit parsingProgress(100);
}
4. ✅ Исправлена кнопка отмены парсинга
Проблема: Кнопка отмены была подключена, но не выполняла реальную отмену.
Исправление:
- Добавлена проверка
isParsingAsync() - Реальная отмена через
m_controller->cancelParsing() - Уведомление пользователя об отмене
Код:
connect(m_cancelParsingAction, &QAction::triggered, this, [this]() {
if (m_controller && m_controller->isParsingAsync()) {
qDebug() << "MainWindow: Отмена парсинга по запросу пользователя";
m_controller->cancelParsing();
m_statusBar->showMessage(tr("Парсинг отменен"));
}
});
Результат исправлений
✅ Теперь асинхронный парсинг работает корректно:
- Начало парсинга - MainWindow получает уведомление и показывает прогресс-бар
- Равномерный прогресс - проценты обновляются плавно на основе реального количества строк
- Детальный прогресс - каждый этап сохранения в БД показывает свой прогресс
- Отмена парсинга - кнопка отмены работает корректно
- Завершение - MainWindow получает уведомление о завершении и обновляет интерфейс
🎯 Использование:
// При нажатии кнопки импорта
m_controller->parseFileAsync(fileName); // ← Асинхронный парсинг
// Сигналы автоматически пробрасываются:
// AltiumParser → MainController → MainWindow
📊 Этапы прогресса:
- 0-80% - Парсинг файла (равномерно по строкам)
- 80-85% - Сохранение вариантов
- 85-90% - Сохранение компонентов
- 90-95% - Сохранение вариативных свойств
- 95-100% - Сохранение параметров проекта
Теперь асинхронный парсинг работает стабильно и показывает точный прогресс! 🎉