Files
GostGenerator/ASYNC_PARSING_FIXES.md
T

152 lines
6.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Исправления асинхронного парсинга
## Проблемы, которые были исправлены
### 1. ✅ Сигнал `parsingStarted` не пробрасывался до MainWindow
**Проблема:** Сигнал `parsingStarted` не был добавлен в `AltiumParser`, поэтому MainWindow не знал о начале парсинга.
**Исправление:**
- Добавлен сигнал `parsingStarted()` в `AltiumParser`
- Подключен сигнал в `MainController`
- MainWindow теперь получает уведомление о начале парсинга
**Код:**
```cpp
// В 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 строк, что создавало неравномерные скачки.
**Исправление:**
- Добавлен предварительный подсчет строк в файле
- Прогресс теперь рассчитывается на основе реального количества строк
- Более равномерное обновление прогресса
**Код:**
```cpp
// Предварительный подсчет строк
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% - сохранение параметров проекта
**Код:**
```cpp
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()`
- Уведомление пользователя об отмене
**Код:**
```cpp
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 получает уведомление о завершении и обновляет интерфейс
### 🎯 Использование:
```cpp
// При нажатии кнопки импорта
m_controller->parseFileAsync(fileName); // ← Асинхронный парсинг
// Сигналы автоматически пробрасываются:
// AltiumParser → MainController → MainWindow
```
### 📊 Этапы прогресса:
- **0-80%** - Парсинг файла (равномерно по строкам)
- **80-85%** - Сохранение вариантов
- **85-90%** - Сохранение компонентов
- **90-95%** - Сохранение вариативных свойств
- **95-100%** - Сохранение параметров проекта
Теперь асинхронный парсинг работает стабильно и показывает точный прогресс! 🎉