Files
GostGenerator/ASYNC_PARSING_FIXES.md

6.1 KiB
Raw Permalink Blame History

Исправления асинхронного парсинга

Проблемы, которые были исправлены

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("Парсинг отменен"));
    }
});

Результат исправлений

Теперь асинхронный парсинг работает корректно:

  1. Начало парсинга - MainWindow получает уведомление и показывает прогресс-бар
  2. Равномерный прогресс - проценты обновляются плавно на основе реального количества строк
  3. Детальный прогресс - каждый этап сохранения в БД показывает свой прогресс
  4. Отмена парсинга - кнопка отмены работает корректно
  5. Завершение - MainWindow получает уведомление о завершении и обновляет интерфейс

🎯 Использование:

// При нажатии кнопки импорта
m_controller->parseFileAsync(fileName);  // ← Асинхронный парсинг

// Сигналы автоматически пробрасываются:
// AltiumParser → MainController → MainWindow

📊 Этапы прогресса:

  • 0-80% - Парсинг файла (равномерно по строкам)
  • 80-85% - Сохранение вариантов
  • 85-90% - Сохранение компонентов
  • 90-95% - Сохранение вариативных свойств
  • 95-100% - Сохранение параметров проекта

Теперь асинхронный парсинг работает стабильно и показывает точный прогресс! 🎉