152 lines
6.1 KiB
Markdown
152 lines
6.1 KiB
Markdown
# Исправления асинхронного парсинга
|
||
|
||
## Проблемы, которые были исправлены
|
||
|
||
### 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%** - Сохранение параметров проекта
|
||
|
||
Теперь асинхронный парсинг работает стабильно и показывает точный прогресс! 🎉 |