Add initial project structure with essential files including .gitignore, application resources, and various model and view components for the application. Implemented asynchronous parsing support and database structure checks.
This commit is contained in:
@@ -0,0 +1,152 @@
|
||||
# Исправления асинхронного парсинга
|
||||
|
||||
## Проблемы, которые были исправлены
|
||||
|
||||
### 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%** - Сохранение параметров проекта
|
||||
|
||||
Теперь асинхронный парсинг работает стабильно и показывает точный прогресс! 🎉
|
||||
Reference in New Issue
Block a user