Перенес формирование Item ов в отдельный поток

This commit is contained in:
krivoshein
2025-01-23 17:54:21 +03:00
parent 2ab543d6eb
commit d6c78ba428
9 changed files with 166 additions and 5 deletions

View File

@@ -3,6 +3,7 @@
#include <QDomDocument>
#include <QMessageBox>
#include <QThread>
#include <QResizeEvent>
#include "ammtaskswidget.h"
#include "ui_ammtaskswidget.h"
@@ -24,6 +25,20 @@ AMMtasksWidget::AMMtasksWidget(ConnectorToServer* connectorToServer, QWidget *pa
ui->btnAssignTaskToTrainee->setEnabled(false);
qDebug() << "AMMtasksWidget init thread ID " << QThread::currentThreadId();
threadPreparation = new QThread();
taskTreePreparation = new TaskTreePreparation();
taskTreePreparation->moveToThread(threadPreparation);
threadPreparation->start();
threadPreparation->setPriority(QThread::HighestPriority);
connect(this, &AMMtasksWidget::signal_prepareListItems, taskTreePreparation, &TaskTreePreparation::slot_prepareListItems);
connect(taskTreePreparation, &TaskTreePreparation::signal_listItemsReady, this, &AMMtasksWidget::slot_listItemsReady);
waitAnimationWidget = new WaitAnimationWidget;
QMovie *movie = new QMovie(":/resources/icons/762.gif");
waitAnimationWidget->setParent(this);
waitAnimationWidget->initialize(movie,this);
waitAnimationWidget->moveToThread(threadPreparation);
}
AMMtasksWidget::~AMMtasksWidget()
@@ -32,6 +47,12 @@ AMMtasksWidget::~AMMtasksWidget()
delete ui;
}
void AMMtasksWidget::resizeEvent(QResizeEvent *event)
{
QSize size = event->size();
waitAnimationWidget->resize(size);
}
void AMMtasksWidget::on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous)
{
if(current == nullptr)
@@ -85,10 +106,26 @@ void AMMtasksWidget::loadTasksAMM()
//Обновление дерева
treeWidget->clear();
waitAnimationWidget->showWithPlay();
QByteArray array = connectorToServer->getListTaskAmmArray();
loadAMMtasksFromXML(array);
fillTree();
//fillTree();
signal_prepareListItems(listAllModules);
}
void AMMtasksWidget::slot_listItemsReady(QList<QTreeWidgetItem *> listItems)
{
//Обновление дерева
treeWidget->clear();
for(QTreeWidgetItem * item : listItems)
{
treeWidget->addTopLevelItem(item);
}
waitAnimationWidget->hideWithStop();
}
void AMMtasksWidget::domElementParser(QDomElement element, Module* moduleParent)
@@ -258,11 +295,12 @@ void AMMtasksWidget::fillTree()
for(Module* module : listAllModules)
{
addModuleToTreeWidget(module);
QTreeWidgetItem* item = addModuleToTreeWidget(module);
treeWidget->addTopLevelItem(item);
}
}
void AMMtasksWidget::addModuleToTreeWidget(Module *module, QTreeWidgetItem* parentItem)
QTreeWidgetItem* AMMtasksWidget::addModuleToTreeWidget(Module *module, QTreeWidgetItem* parentItem)
{
QTreeWidgetItem* itemModule = nullptr;
@@ -276,7 +314,8 @@ void AMMtasksWidget::addModuleToTreeWidget(Module *module, QTreeWidgetItem* pare
}
else
{
itemModule = new QTreeWidgetItem(treeWidget);
//itemModule = new QTreeWidgetItem(treeWidget);
itemModule = new QTreeWidgetItem();
}
if(module->getType() == ModuleType::TYPE_PM)
@@ -301,6 +340,8 @@ void AMMtasksWidget::addModuleToTreeWidget(Module *module, QTreeWidgetItem* pare
itemModule->setText(ColumnsTree::clmn_PMorDM, text);
itemModule->setText(ColumnsTree::clmn_ID, ID);
return itemModule;
}

View File

@@ -6,6 +6,7 @@
#include <QDomNode>
#include "module.h"
#include "connectortoserver.h"
#include "taskTreePreparation.h"
namespace Ui {
class AMMtasksWidget;
@@ -31,6 +32,9 @@ public:
treeWidget->clear();
}
public:
void resizeEvent(QResizeEvent *event) override;
private Q_SLOTS:
void on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous);
void on_btnUpdateTasks_clicked();
@@ -53,10 +57,15 @@ private:
void reSetHeadTreeWidget();
void fillTree();
void addModuleToTreeWidget(Module* module, QTreeWidgetItem* parentItem = nullptr);
QTreeWidgetItem* addModuleToTreeWidget(Module* module, QTreeWidgetItem* parentItem = nullptr);
void loadTasksAMM();
Q_SIGNALS:
void signal_prepareListItems(QList<Module*> listAllModules);
public Q_SLOTS:
void slot_listItemsReady(QList<QTreeWidgetItem*> listItems);
private:
Ui::AMMtasksWidget *ui;
ConnectorToServer* connectorToServer;
@@ -65,6 +74,10 @@ private:
private:
QList<Module*> listAllModules;
QString loginTraineeSelected;
QThread* threadPreparation;
TaskTreePreparation* taskTreePreparation;
WaitAnimationWidget *waitAnimationWidget;
};
#endif // AMMTASKSWIDGET_H

View File

@@ -0,0 +1,67 @@
#include <QThread>
#include <QDebug>
#include "tasktreepreparation.h"
TaskTreePreparation::TaskTreePreparation(QObject *parent) : QObject(parent)
{
qDebug() << "TaskTreePreparation init thread ID " << QThread::currentThreadId();
}
QTreeWidgetItem *TaskTreePreparation::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(0, text);
itemModule->setText(1, ID);
return itemModule;
}
void TaskTreePreparation::slot_prepareListItems(QList<Module *> listAllModules)
{
qDebug() << "TaskTreePreparation::slot_prepareListItems thread ID " << QThread::currentThreadId();
listItems.clear();
for(Module* module : listAllModules)
{
QTreeWidgetItem* item = addModuleToTreeWidget(module);
listItems.append(item);
}
Q_EMIT signal_listItemsReady(listItems);
}

View File

@@ -0,0 +1,27 @@
#ifndef TASKTREEPREPARATION_H
#define TASKTREEPREPARATION_H
#include <QObject>
#include <QTreeWidgetItem>
#include "module.h"
class TaskTreePreparation : public QObject
{
Q_OBJECT
public:
explicit TaskTreePreparation(QObject *parent = nullptr);
public:
QTreeWidgetItem* addModuleToTreeWidget(Module* module, QTreeWidgetItem* parentItem = nullptr);
public Q_SLOTS:
void slot_prepareListItems(QList<Module*> listAllModules);
Q_SIGNALS:
void signal_listItemsReady(QList<QTreeWidgetItem*> listItems);
private:
QList<QTreeWidgetItem*> listItems;
};
#endif // TASKTREEPREPARATION_H