Перенес парсинг taskAMM.XML в отдельный поток

This commit is contained in:
krivoshein
2025-01-24 09:58:56 +03:00
parent d6c78ba428
commit 987ad12893
4 changed files with 171 additions and 220 deletions

View File

@@ -11,10 +11,17 @@ AMMtasksWidget::AMMtasksWidget(ConnectorToServer* connectorToServer, QWidget *pa
QWidget(parent), QWidget(parent),
ui(new Ui::AMMtasksWidget), ui(new Ui::AMMtasksWidget),
connectorToServer(connectorToServer), connectorToServer(connectorToServer),
loginTraineeSelected("") treeWidget(nullptr),
loginTraineeSelected(""),
threadPreparation(nullptr),
threadAnimation(nullptr),
taskTreePreparation(nullptr),
waitAnimationWidget(nullptr)
{ {
ui->setupUi(this); ui->setupUi(this);
qDebug() << "AMMtasksWidget init thread ID " << QThread::currentThreadId();
treeWidget = new QTreeWidget(); treeWidget = new QTreeWidget();
ui->horizontalLayout_1->addWidget(treeWidget); ui->horizontalLayout_1->addWidget(treeWidget);
@@ -22,9 +29,7 @@ AMMtasksWidget::AMMtasksWidget(ConnectorToServer* connectorToServer, QWidget *pa
preparationTreeWidget(); preparationTreeWidget();
ui->btnAssignTaskToTrainee->setEnabled(false); ui->btnAssignTaskToTrainee->setEnabled(false);
qDebug() << "AMMtasksWidget init thread ID " << QThread::currentThreadId();
threadPreparation = new QThread(); threadPreparation = new QThread();
taskTreePreparation = new TaskTreePreparation(); taskTreePreparation = new TaskTreePreparation();
@@ -34,16 +39,17 @@ AMMtasksWidget::AMMtasksWidget(ConnectorToServer* connectorToServer, QWidget *pa
connect(this, &AMMtasksWidget::signal_prepareListItems, taskTreePreparation, &TaskTreePreparation::slot_prepareListItems); connect(this, &AMMtasksWidget::signal_prepareListItems, taskTreePreparation, &TaskTreePreparation::slot_prepareListItems);
connect(taskTreePreparation, &TaskTreePreparation::signal_listItemsReady, this, &AMMtasksWidget::slot_listItemsReady); connect(taskTreePreparation, &TaskTreePreparation::signal_listItemsReady, this, &AMMtasksWidget::slot_listItemsReady);
waitAnimationWidget = new WaitAnimationWidget; threadAnimation = new QThread();
waitAnimationWidget = new WaitAnimationWidget;
QMovie *movie = new QMovie(":/resources/icons/762.gif"); QMovie *movie = new QMovie(":/resources/icons/762.gif");
waitAnimationWidget->setParent(this); waitAnimationWidget->setParent(this);
waitAnimationWidget->initialize(movie,this); waitAnimationWidget->initialize(movie,this);
waitAnimationWidget->moveToThread(threadPreparation); waitAnimationWidget->moveToThread(threadAnimation);
threadAnimation->start();
} }
AMMtasksWidget::~AMMtasksWidget() AMMtasksWidget::~AMMtasksWidget()
{ {
deleteAllModuls();
delete ui; delete ui;
} }
@@ -109,10 +115,8 @@ void AMMtasksWidget::loadTasksAMM()
waitAnimationWidget->showWithPlay(); waitAnimationWidget->showWithPlay();
QByteArray array = connectorToServer->getListTaskAmmArray(); QByteArray array = connectorToServer->getListTaskAmmArray();
loadAMMtasksFromXML(array);
//fillTree(); signal_prepareListItems(array, &listAllModules);
signal_prepareListItems(listAllModules);
} }
void AMMtasksWidget::slot_listItemsReady(QList<QTreeWidgetItem *> listItems) void AMMtasksWidget::slot_listItemsReady(QList<QTreeWidgetItem *> listItems)
@@ -121,141 +125,11 @@ void AMMtasksWidget::slot_listItemsReady(QList<QTreeWidgetItem *> listItems)
treeWidget->clear(); treeWidget->clear();
for(QTreeWidgetItem * item : listItems) for(QTreeWidgetItem * item : listItems)
{
treeWidget->addTopLevelItem(item); treeWidget->addTopLevelItem(item);
}
waitAnimationWidget->hideWithStop(); waitAnimationWidget->hideWithStop();
} }
void AMMtasksWidget::domElementParser(QDomElement element, Module* moduleParent)
{
QString name;
QDomElement childElement = element.firstChildElement();
if(childElement.isNull())
return;
Module* module = nullptr;
do
{
name = childElement.nodeName();
QDomNamedNodeMap nodeMap = childElement.attributes();
if(name == "pm")
{
module = new PM();
PM* PMmodul = static_cast<PM*>(module);
PMmodul->initialize(nodeMap.namedItem("modelIdentCode").nodeValue(),
nodeMap.namedItem("pmIssuer").nodeValue(),
nodeMap.namedItem("pmNumber").nodeValue(),
nodeMap.namedItem("pmVolume").nodeValue());
if(moduleParent)
{
PMmodul->setParentModule(moduleParent);
PM* PMmodulParent = static_cast<PM*>(moduleParent);
PMmodulParent->addChildModule(module);
}
}
else if(name == "dm")
{
module = new DM();
DM* DMmodul = static_cast<DM*>(module);
DMmodul->initialize(nodeMap.namedItem("modelIdentCode").nodeValue(),
nodeMap.namedItem("systemDiffCode").nodeValue(),
nodeMap.namedItem("systemCode").nodeValue(),
nodeMap.namedItem("subSystemCode").nodeValue(),
nodeMap.namedItem("subSubSystemCode").nodeValue(),
nodeMap.namedItem("assyCode").nodeValue(),
nodeMap.namedItem("disassyCode").nodeValue(),
nodeMap.namedItem("disassyCodeVariant").nodeValue(),
nodeMap.namedItem("infoCode").nodeValue(),
nodeMap.namedItem("infoCodeVariant").nodeValue(),
nodeMap.namedItem("itemLocationCode").nodeValue());
if(moduleParent)
{
DMmodul->setParentModule(moduleParent);
PM* PMmodulParent = static_cast<PM*>(moduleParent);
PMmodulParent->addChildModule(module);
}
}
else if(name == "rus" || name == "eng")
{
if(moduleParent)
{
if(moduleParent->getType() == ModuleType::TYPE_PM)
{//PM
PM* PMmodulParent = static_cast<PM*>(moduleParent);
if(name == "rus")
PMmodulParent->setLangStructRus(nodeMap.namedItem("title").nodeValue());
else
PMmodulParent->setLangStructEng(nodeMap.namedItem("title").nodeValue());
}
else
{//DM
DM* DMmodulParent = static_cast<DM*>(moduleParent);
if(name == "rus")
DMmodulParent->setLangStructRus(nodeMap.namedItem("techName").nodeValue(),
nodeMap.namedItem("infoName").nodeValue(),
nodeMap.namedItem("pdf").nodeValue(),
nodeMap.namedItem("bookmark").nodeValue(),
nodeMap.namedItem("xml").nodeValue());
else
DMmodulParent->setLangStructEng(nodeMap.namedItem("techName").nodeValue(),
nodeMap.namedItem("infoName").nodeValue(),
nodeMap.namedItem("pdf").nodeValue(),
nodeMap.namedItem("bookmark").nodeValue(),
nodeMap.namedItem("xml").nodeValue());
}
}
}
domElementParser(childElement, module);
if(moduleParent == nullptr)
listAllModules.append(module);
}while (! (childElement = childElement.nextSiblingElement()).isNull());
}
void AMMtasksWidget::loadAMMtasksFromXML(QByteArray array)
{
deleteAllModuls();
QDomDocument docTasksDOM;
docTasksDOM.setContent(array);
QDomElement manifestElement = docTasksDOM.firstChildElement("manifest");
if(manifestElement.isNull())
return;
domElementParser(manifestElement, nullptr);
}
void AMMtasksWidget::deleteAllModuls()
{
for(Module* module: listAllModules)
{
if(module->getType() == ModuleType::TYPE_PM)
delete static_cast<PM*>(module);
else
delete static_cast<DM*>(module);
}
listAllModules.clear();
}
Module *AMMtasksWidget::searchModuleByID(int id) Module *AMMtasksWidget::searchModuleByID(int id)
{ {
Module* ptrModule = nullptr; Module* ptrModule = nullptr;
@@ -288,63 +162,6 @@ void AMMtasksWidget::reSetHeadTreeWidget()
treeWidget->setHeaderLabels(listHeaders); treeWidget->setHeaderLabels(listHeaders);
} }
void AMMtasksWidget::fillTree()
{
//Обновление дерева
treeWidget->clear();
for(Module* module : listAllModules)
{
QTreeWidgetItem* item = addModuleToTreeWidget(module);
treeWidget->addTopLevelItem(item);
}
}
QTreeWidgetItem* AMMtasksWidget::addModuleToTreeWidget(Module *module, QTreeWidgetItem* parentItem)
{
QTreeWidgetItem* itemModule = nullptr;
QString text;
QString ID = QString::number(module->getID());
if(parentItem)
{
itemModule = new QTreeWidgetItem();
parentItem->addChild(itemModule);
}
else
{
//itemModule = new QTreeWidgetItem(treeWidget);
itemModule = new QTreeWidgetItem();
}
if(module->getType() == ModuleType::TYPE_PM)
{
PM* PMmodul = static_cast<PM*>(module);
text = PMmodul->getLangStructRus().title;
for(Module* module : PMmodul->getListChildModules())
{
addModuleToTreeWidget(module, itemModule);
}
}
else
{
DM* DMmodul = static_cast<DM*>(module);
text = DMmodul->getLangStructRus().techName;
//itemModule->setFlags(itemModule->flags() | Qt::ItemIsUserCheckable);
//itemModule->setCheckState(0, Qt::Checked);
itemModule->setIcon(0, QIcon(":/resources/icons/procedure.png"));
}
itemModule->setText(ColumnsTree::clmn_PMorDM, text);
itemModule->setText(ColumnsTree::clmn_ID, ID);
return itemModule;
}
void AMMtasksWidget::on_btnUpdateTasks_clicked() void AMMtasksWidget::on_btnUpdateTasks_clicked()
{ {
connectorToServer->sendQueryTasksXML("amm"); connectorToServer->sendQueryTasksXML("amm");

View File

@@ -38,7 +38,6 @@ public:
private Q_SLOTS: private Q_SLOTS:
void on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous); void on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous);
void on_btnUpdateTasks_clicked(); void on_btnUpdateTasks_clicked();
void on_btnAssignTaskToTrainee_clicked(); void on_btnAssignTaskToTrainee_clicked();
public Q_SLOTS: public Q_SLOTS:
@@ -48,21 +47,13 @@ public Q_SLOTS:
void slot_traineeSelected(QString login); void slot_traineeSelected(QString login);
private: private:
void loadAMMtasksFromXML(QByteArray array);
void domElementParser(QDomElement element, Module* moduleParent);
void deleteAllModuls();
Module* searchModuleByID(int id); Module* searchModuleByID(int id);
void preparationTreeWidget(); void preparationTreeWidget();
void reSetHeadTreeWidget(); void reSetHeadTreeWidget();
void fillTree();
QTreeWidgetItem* addModuleToTreeWidget(Module* module, QTreeWidgetItem* parentItem = nullptr);
void loadTasksAMM(); void loadTasksAMM();
Q_SIGNALS: Q_SIGNALS:
void signal_prepareListItems(QList<Module*> listAllModules); void signal_prepareListItems(QByteArray array, QList<Module*>* listAllModules);
public Q_SLOTS: public Q_SLOTS:
void slot_listItemsReady(QList<QTreeWidgetItem*> listItems); void slot_listItemsReady(QList<QTreeWidgetItem*> listItems);
@@ -76,6 +67,7 @@ private:
QString loginTraineeSelected; QString loginTraineeSelected;
QThread* threadPreparation; QThread* threadPreparation;
QThread* threadAnimation;
TaskTreePreparation* taskTreePreparation; TaskTreePreparation* taskTreePreparation;
WaitAnimationWidget *waitAnimationWidget; WaitAnimationWidget *waitAnimationWidget;
}; };

View File

@@ -2,11 +2,18 @@
#include <QDebug> #include <QDebug>
#include "tasktreepreparation.h" #include "tasktreepreparation.h"
TaskTreePreparation::TaskTreePreparation(QObject *parent) : QObject(parent) TaskTreePreparation::TaskTreePreparation(QObject *parent) :
QObject(parent),
listAllModules(nullptr)
{ {
qDebug() << "TaskTreePreparation init thread ID " << QThread::currentThreadId(); qDebug() << "TaskTreePreparation init thread ID " << QThread::currentThreadId();
} }
TaskTreePreparation::~TaskTreePreparation()
{
deleteAllModuls();
}
QTreeWidgetItem *TaskTreePreparation::addModuleToTreeWidget(Module *module, QTreeWidgetItem *parentItem) QTreeWidgetItem *TaskTreePreparation::addModuleToTreeWidget(Module *module, QTreeWidgetItem *parentItem)
{ {
QTreeWidgetItem* itemModule = nullptr; QTreeWidgetItem* itemModule = nullptr;
@@ -14,16 +21,10 @@ QTreeWidgetItem *TaskTreePreparation::addModuleToTreeWidget(Module *module, QTre
QString text; QString text;
QString ID = QString::number(module->getID()); QString ID = QString::number(module->getID());
itemModule = new QTreeWidgetItem();
if(parentItem) if(parentItem)
{
itemModule = new QTreeWidgetItem();
parentItem->addChild(itemModule); parentItem->addChild(itemModule);
}
else
{
//itemModule = new QTreeWidgetItem(treeWidget);
itemModule = new QTreeWidgetItem();
}
if(module->getType() == ModuleType::TYPE_PM) if(module->getType() == ModuleType::TYPE_PM)
{ {
@@ -51,13 +52,148 @@ QTreeWidgetItem *TaskTreePreparation::addModuleToTreeWidget(Module *module, QTre
return itemModule; return itemModule;
} }
void TaskTreePreparation::slot_prepareListItems(QList<Module *> listAllModules) void TaskTreePreparation::loadAMMtasksFromXML(QByteArray array)
{
deleteAllModuls();
QDomDocument docTasksDOM;
docTasksDOM.setContent(array);
QDomElement manifestElement = docTasksDOM.firstChildElement("manifest");
if(manifestElement.isNull())
return;
domElementParser(manifestElement, nullptr);
}
void TaskTreePreparation::deleteAllModuls()
{
if(listAllModules == nullptr)
return;
for(Module* module: *listAllModules)
{
if(module->getType() == ModuleType::TYPE_PM)
delete static_cast<PM*>(module);
else
delete static_cast<DM*>(module);
}
listAllModules->clear();
}
void TaskTreePreparation::domElementParser(QDomElement element, Module* moduleParent)
{
QString name;
QDomElement childElement = element.firstChildElement();
if(childElement.isNull())
return;
Module* module = nullptr;
do
{
name = childElement.nodeName();
QDomNamedNodeMap nodeMap = childElement.attributes();
if(name == "pm")
{
module = new PM();
PM* PMmodul = static_cast<PM*>(module);
PMmodul->initialize(nodeMap.namedItem("modelIdentCode").nodeValue(),
nodeMap.namedItem("pmIssuer").nodeValue(),
nodeMap.namedItem("pmNumber").nodeValue(),
nodeMap.namedItem("pmVolume").nodeValue());
if(moduleParent)
{
PMmodul->setParentModule(moduleParent);
PM* PMmodulParent = static_cast<PM*>(moduleParent);
PMmodulParent->addChildModule(module);
}
}
else if(name == "dm")
{
module = new DM();
DM* DMmodul = static_cast<DM*>(module);
DMmodul->initialize(nodeMap.namedItem("modelIdentCode").nodeValue(),
nodeMap.namedItem("systemDiffCode").nodeValue(),
nodeMap.namedItem("systemCode").nodeValue(),
nodeMap.namedItem("subSystemCode").nodeValue(),
nodeMap.namedItem("subSubSystemCode").nodeValue(),
nodeMap.namedItem("assyCode").nodeValue(),
nodeMap.namedItem("disassyCode").nodeValue(),
nodeMap.namedItem("disassyCodeVariant").nodeValue(),
nodeMap.namedItem("infoCode").nodeValue(),
nodeMap.namedItem("infoCodeVariant").nodeValue(),
nodeMap.namedItem("itemLocationCode").nodeValue());
if(moduleParent)
{
DMmodul->setParentModule(moduleParent);
PM* PMmodulParent = static_cast<PM*>(moduleParent);
PMmodulParent->addChildModule(module);
}
}
else if(name == "rus" || name == "eng")
{
if(moduleParent)
{
if(moduleParent->getType() == ModuleType::TYPE_PM)
{//PM
PM* PMmodulParent = static_cast<PM*>(moduleParent);
if(name == "rus")
PMmodulParent->setLangStructRus(nodeMap.namedItem("title").nodeValue());
else
PMmodulParent->setLangStructEng(nodeMap.namedItem("title").nodeValue());
}
else
{//DM
DM* DMmodulParent = static_cast<DM*>(moduleParent);
if(name == "rus")
DMmodulParent->setLangStructRus(nodeMap.namedItem("techName").nodeValue(),
nodeMap.namedItem("infoName").nodeValue(),
nodeMap.namedItem("pdf").nodeValue(),
nodeMap.namedItem("bookmark").nodeValue(),
nodeMap.namedItem("xml").nodeValue());
else
DMmodulParent->setLangStructEng(nodeMap.namedItem("techName").nodeValue(),
nodeMap.namedItem("infoName").nodeValue(),
nodeMap.namedItem("pdf").nodeValue(),
nodeMap.namedItem("bookmark").nodeValue(),
nodeMap.namedItem("xml").nodeValue());
}
}
}
domElementParser(childElement, module);
if(moduleParent == nullptr)
listAllModules->append(module);
}while (! (childElement = childElement.nextSiblingElement()).isNull());
}
void TaskTreePreparation::slot_prepareListItems(QByteArray array, QList<Module*>* listAllModules)
{ {
qDebug() << "TaskTreePreparation::slot_prepareListItems thread ID " << QThread::currentThreadId(); qDebug() << "TaskTreePreparation::slot_prepareListItems thread ID " << QThread::currentThreadId();
this->listAllModules = listAllModules;
loadAMMtasksFromXML(array);
listItems.clear(); listItems.clear();
for(Module* module : listAllModules) for(Module* module : *this->listAllModules)
{ {
QTreeWidgetItem* item = addModuleToTreeWidget(module); QTreeWidgetItem* item = addModuleToTreeWidget(module);
listItems.append(item); listItems.append(item);

View File

@@ -3,6 +3,7 @@
#include <QObject> #include <QObject>
#include <QTreeWidgetItem> #include <QTreeWidgetItem>
#include <QDomElement>
#include "module.h" #include "module.h"
class TaskTreePreparation : public QObject class TaskTreePreparation : public QObject
@@ -10,18 +11,23 @@ class TaskTreePreparation : public QObject
Q_OBJECT Q_OBJECT
public: public:
explicit TaskTreePreparation(QObject *parent = nullptr); explicit TaskTreePreparation(QObject *parent = nullptr);
~TaskTreePreparation();
public: private:
QTreeWidgetItem* addModuleToTreeWidget(Module* module, QTreeWidgetItem* parentItem = nullptr); QTreeWidgetItem* addModuleToTreeWidget(Module* module, QTreeWidgetItem* parentItem = nullptr);
void loadAMMtasksFromXML(QByteArray array);
void domElementParser(QDomElement element, Module* moduleParent);
void deleteAllModuls();
public Q_SLOTS: public Q_SLOTS:
void slot_prepareListItems(QList<Module*> listAllModules); void slot_prepareListItems(QByteArray array, QList<Module*>* listAllModules);
Q_SIGNALS: Q_SIGNALS:
void signal_listItemsReady(QList<QTreeWidgetItem*> listItems); void signal_listItemsReady(QList<QTreeWidgetItem*> listItems);
private: private:
QList<QTreeWidgetItem*> listItems; QList<QTreeWidgetItem*> listItems;
QList<Module*>* listAllModules;
}; };
#endif // TASKTREEPREPARATION_H #endif // TASKTREEPREPARATION_H