Skip to content
Snippets Groups Projects
Commit cc71c579 authored by Pospelov, Gennady's avatar Pospelov, Gennady
Browse files

JobItem is running in a thread

parent a1b9aaa5
No related branches found
No related tags found
No related merge requests found
Showing
with 383 additions and 111 deletions
#include "JobItem.h"
#include <QTimer>
#include <QDebug>
JobItem::JobItem()
: m_counterForDelayedLoop(0)
{
}
JobItem::~JobItem()
{
qDebug() << "JobItem::~JobItem()";
}
void JobItem::run()
{
qDebug() << "JobItem::run() 1.1";
loopFunctionWithDelay();
qDebug() << "JobItem::run() 1.2 emiting finished";
}
void JobItem::loopFunctionWithDelay()
{
qDebug() << "JobItem::loopFunctionWithDelay()" << m_counterForDelayedLoop;
if(m_counterForDelayedLoop < 100) {
m_counterForDelayedLoop++;
qDebug() << "XXX1";
QTimer::singleShot(500, this, SLOT(loopFunctionWithDelay()));
qDebug() << "XXX2";
}
if(m_counterForDelayedLoop == 100) emit finished();
}
#ifndef JOBITEM_H
#define JOBITEM_H
#include <QObject>
class JobItem : public QObject
{
Q_OBJECT
public:
JobItem();
virtual ~JobItem();
public slots:
void run();
private slots:
void loopFunctionWithDelay();
signals:
void finished();
private:
int m_counterForDelayedLoop;
};
#endif
#include "JobQueueItem.h"
#include "JobQueueModel.h"
#include "JobItem.h"
#include "OutputDataItem.h"
#include "GUIHelpers.h"
#include <QXmlStreamWriter>
#include <QDebug>
#include <QTimer>
#include <QThread>
JobQueueItem::JobQueueItem(QString name)
: m_name(name)
{
m_data_items.append(new OutputDataItem());
// mp_job_watcher = new QFutureWatcher<void>;
// connect(mp_job_watcher, SIGNAL(finished()), this, SLOT(onJobFinished()));
// m_jobItem = new JobItem();
}
......@@ -18,6 +27,54 @@ JobQueueItem::~JobQueueItem()
}
void JobQueueItem::run()
{
qDebug() << "JobQueueItem::run(): preparing to run a thread";
JobItem *jobItem = new JobItem();
QThread *thread = new QThread();
jobItem->moveToThread(thread);
// thread will start jobItem::run
connect(thread, SIGNAL(started()), jobItem, SLOT(run()));
// thread will quit after JobItem is done
connect(jobItem, SIGNAL(finished()), thread, SLOT(quit()));
connect(jobItem, SIGNAL(finished()), this, SLOT(onJobFinished()));
// objects will be deleted after JobItem is done
connect(jobItem, SIGNAL(finished()), jobItem, SLOT(deleteLater()));
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
qDebug() << "JobQueueItem::run(): starting thread";
thread->start();
qDebug() << "JobQueueItem::run(): thread is started";
}
void JobQueueItem::onJobFinished()
{
qDebug() << "JobQueueItem::onJobFinished()";
}
//void JobQueueItem::loopFunctionWithDelay()
//{
// qDebug() << "JobQueueItem::loopFunctionWithDelay()" << m_counterForDelayedLoop;
// if(m_counterForDelayedLoop < 100) {
// m_counterForDelayedLoop++;
// qDebug() << "XXX1";
// QTimer::singleShot(5000, this, SLOT(loopFunctionWithDelay()));
// qDebug() << "XXX2";
// }
//}
// --------------------
void JobQueueItem::clear()
{
qDeleteAll(m_data_items);
......
......@@ -4,13 +4,16 @@
#include <QList>
#include <QVariant>
#include <QString>
#include <QFutureWatcher>
class QXmlStreamWriter;
class QXmlStreamReader;
class OutputDataItem;
class JobQueueItem
class JobQueueItem : public QObject
{
Q_OBJECT
public:
JobQueueItem(QString name);
virtual ~JobQueueItem();
......@@ -35,6 +38,14 @@ public:
void clear();
void run();
// QFutureWatcher<void> *getJobWatcher() { return mp_job_watcher; }
public slots:
void onJobFinished();
// void loopFunctionWithDelay();
private:
QString m_name;
QString m_begin_time;
......@@ -42,6 +53,10 @@ private:
QString m_comments;
QString m_status;
QList<OutputDataItem *> m_data_items;
// int m_counterForDelayedLoop ;
// QFutureWatcher<void> *mp_job_watcher;
};
......
......@@ -84,6 +84,16 @@ bool JobQueueModel::setData(const QModelIndex &index, const QVariant &value, int
//}
void JobQueueModel::addJob(JobQueueItem *item)
{
int position = m_jobs.size();
beginInsertRows(QModelIndex(), position, position);
m_jobs.append(item);
endInsertRows();
}
bool JobQueueModel::removeRows(int position, int rows, const QModelIndex &/* parent */)
{
qDebug() << "JobQueueModel::removeRows";
......@@ -284,15 +294,17 @@ void JobQueueModel::onSelectionChanged( const QItemSelection &selected, const QI
}
//! returns model index of given JobQueueItem
QModelIndex JobQueueModel::indexOfItem(JobQueueItem *item) const
{
if(m_jobs.contains(item)) {
return index(m_jobs.indexOf(item), 0);
}
throw GUIHelpers::Error("Can't find index for item");
throw GUIHelpers::Error("JobQueueModel::indexOfItem() -> Can't find index for item");
}
//! Method should be called to inform given model about changes in JobQueueItem
void JobQueueModel::jobQueueItemIsChanged(JobQueueItem *changed_item)
{
QModelIndex item_index = indexOfItem(changed_item);
......@@ -301,3 +313,14 @@ void JobQueueModel::jobQueueItemIsChanged(JobQueueItem *changed_item)
}
//! returns JobQueueItem for given index
JobQueueItem *JobQueueModel::getJobQueueItemForIndex(const QModelIndex &index)
{
if(!index.isValid())
throw GUIHelpers::Error("JobQueueModel::getJobQueueItemForIndex() -> Can't find item for index");
if(index.row() >=0 && index.row() < rowCount())
return m_jobs.at(index.row());
throw GUIHelpers::Error("JobQueueModel::getJobQueueItemForIndex() -> Can't find item for index p2");
}
......@@ -61,10 +61,7 @@ public:
int row, int column, const QModelIndex &parent);
void addJob(JobQueueItem *item)
{
m_jobs.append(item);
}
void addJob(JobQueueItem *item);
void clear();
......@@ -78,13 +75,13 @@ public:
void setName(QString name) { m_name = name; }
void jobQueueItemIsChanged(JobQueueItem *item);
JobQueueItem *getJobQueueItemForIndex(const QModelIndex &index);
public slots:
void onSelectionChanged( const QItemSelection&, const QItemSelection& );
signals:
void selectionChanged(JobQueueItem *item);
// void selectionChanged(const QModelIndex &index);
private:
QModelIndex indexOfItem(JobQueueItem *item) const;
......
#include "JobListViewDelegate.h"
#include <QDebug>
JobListViewDelegate::JobListViewDelegate(QWidget *parent)
: QItemDelegate(parent)
{
}
void JobListViewDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
const QModelIndex &index ) const
{
qDebug() << "JobListViewDelegate::paint() " << index;
QItemDelegate::paint(painter, option, index);
}
#ifndef JOBLISTVIEWDELEGATE_H
#define JOBLISTVIEWDELEGATE_H
#include <QItemDelegate>
//! ViewDelegate to show progress bar JobQueuListView
class JobListViewDelegate : public QItemDelegate
{
Q_OBJECT
public:
JobListViewDelegate(QWidget *parent);
void paint(QPainter *painter, const QStyleOptionViewItem &option,
const QModelIndex &index ) const;
};
#endif
#include "JobListWidget.h"
#include "JobQueueModel.h"
#include "JobQueueItem.h"
#include "JobListViewDelegate.h"
#include "progressbar.h"
#include "styledbar.h"
#include <QPushButton>
#include <QListView>
#include <QVBoxLayout>
#include <QDebug>
JobListWidget::JobListWidget(QWidget *parent)
: QWidget(parent)
, m_jobQueueModel(0)
, m_listView(new QListView(this))
, m_submitButton(new QPushButton("Submit"))
, m_runButton(new QPushButton("Run"))
, m_saveButton(new QPushButton("Save"))
{
// setMinimumSize(128, 128);
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
m_listView->setDragEnabled(true);
m_listView->setAcceptDrops(true);
m_listView->setDefaultDropAction(Qt::MoveAction);
m_listView->setItemDelegate(new JobListViewDelegate(this));
QVBoxLayout *mainLayout = new QVBoxLayout;
mainLayout->setMargin(0);
mainLayout->setSpacing(0);
Manhattan::StyledBar *bar = new Manhattan::StyledBar;
mainLayout->addWidget(bar);
QHBoxLayout *buttonsLayout = new QHBoxLayout;
buttonsLayout->addWidget(m_submitButton);
buttonsLayout->addWidget(m_runButton);
buttonsLayout->addWidget(m_saveButton);
buttonsLayout->addStretch(1);
QVBoxLayout *vlayout = new QVBoxLayout;
vlayout->setMargin(10);
vlayout->setSpacing(10);
vlayout->addLayout(buttonsLayout);
vlayout->addWidget(m_listView);
Manhattan::ProgressBar *progressBar = new Manhattan::ProgressBar(this);
progressBar->setRange(0,100);
progressBar->setValue(50);
vlayout->addWidget(progressBar);
//mainLayout->addWidget(m_listView);
mainLayout->addLayout(vlayout);
connect(m_saveButton, SIGNAL(clicked()), this, SLOT(save()));
connect(m_submitButton, SIGNAL(clicked()), this, SLOT(submit()));
connect(m_runButton, SIGNAL(clicked()), this, SLOT(run()));
setLayout(mainLayout);
}
void JobListWidget::setModel(JobQueueModel *model)
{
Q_ASSERT(model);
if(model != m_jobQueueModel) {
m_jobQueueModel = model;
m_listView->setModel(model);
connect(m_listView->selectionModel(),
SIGNAL( selectionChanged(const QItemSelection&, const QItemSelection&) ),
m_jobQueueModel,
SLOT( onSelectionChanged(const QItemSelection&, const QItemSelection&) )
);
}
}
void JobListWidget::save()
{
Q_ASSERT(m_jobQueueModel);
qDebug() << "JobListWidget::save() -> ";
m_jobQueueModel->save("tmp2.xml");
}
void JobListWidget::submit()
{
Q_ASSERT(m_jobQueueModel);
qDebug() << "JobListWidget::submit() -> ";
static int i=4;
m_jobQueueModel->addJob(new JobQueueItem(QString("job")+QString::number(i++)));
}
void JobListWidget::run()
{
Q_ASSERT(m_jobQueueModel);
qDebug() << "JobListWidget::run()";
QModelIndexList indexList = m_listView->selectionModel()->selectedIndexes();
qDebug() <<indexList;
if(!indexList.empty()) {
JobQueueItem *job = m_jobQueueModel->getJobQueueItemForIndex(indexList.front());
qDebug() << "JobListWidget::run()" << job->getName();
job->run();
}
}
#ifndef JOBLISTWIDGET_H
#define JOBLISTWIDGET_H
#include <QWidget>
class JobQueueModel;
class QListView;
class QPushButton;
//! Widget to select JobQueueItem in a list
//! Top left corner of JobQueueView
//! Part of JobSelectorWidget
class JobListWidget : public QWidget
{
Q_OBJECT
public:
explicit JobListWidget(QWidget *parent = 0);
void setModel(JobQueueModel *model);
// QSize sizeHint() const { return QSize(128, 128); }
public slots:
private slots:
void save();
void submit();
void run();
private:
JobQueueModel *m_jobQueueModel;
QListView *m_listView;
QPushButton *m_submitButton;
QPushButton *m_runButton;
QPushButton *m_saveButton;
};
#endif
......@@ -13,8 +13,8 @@ JobPropertiesWidget::JobPropertiesWidget(QWidget *parent)
, m_propertyBrowser(new QtTreePropertyBrowser(this))
, m_currentItem(0)
{
setMinimumSize(128, 128);
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
// setMinimumSize(128, 128);
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
setWindowTitle(QLatin1String("Job Properties"));
setObjectName(QLatin1String("Job Properties"));
// setStyleSheet("background-color:white;");
......
......@@ -20,6 +20,9 @@ public:
void setModel(JobQueueModel *model);
QSize sizeHint() const { return QSize(64, 64); }
QSize minimumSizeHint() const { return QSize(64, 64); }
public slots:
void itemClicked(JobQueueItem *item);
......
#include "JobSelectorWidget.h"
#include "JobQueueModel.h"
#include "JobQueueItem.h"
#include "JobPropertiesWidget.h"
#include "JobListWidget.h"
#include "styledbar.h"
#include "minisplitter.h"
#include "progressbar.h"
#include <QSplitter>
#include <QListView>
#include <QPushButton>
......@@ -11,81 +14,6 @@
#include <QDebug>
JobListWidget::JobListWidget(QWidget *parent)
: QWidget(parent)
, m_jobQueueModel(0)
, m_listView(new QListView(this))
, m_button1(new QPushButton("Submit"))
, m_button2(new QPushButton("Run"))
, m_saveButton(new QPushButton("Save"))
{
setMinimumSize(128, 400);
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
m_listView->setDragEnabled(true);
m_listView->setAcceptDrops(true);
m_listView->setDefaultDropAction(Qt::MoveAction);
QVBoxLayout *mainLayout = new QVBoxLayout;
mainLayout->setMargin(0);
mainLayout->setSpacing(0);
Manhattan::StyledBar *bar = new Manhattan::StyledBar;
mainLayout->addWidget(bar);
QHBoxLayout *buttonsLayout = new QHBoxLayout;
buttonsLayout->addWidget(m_button1);
buttonsLayout->addWidget(m_button2);
buttonsLayout->addWidget(m_saveButton);
buttonsLayout->addStretch(1);
QVBoxLayout *vlayout = new QVBoxLayout;
vlayout->setMargin(10);
vlayout->setSpacing(10);
vlayout->addLayout(buttonsLayout);
vlayout->addWidget(m_listView);
//mainLayout->addWidget(m_listView);
mainLayout->addLayout(vlayout);
connect(m_saveButton, SIGNAL(clicked()), this, SLOT(save()));
setLayout(mainLayout);
}
void JobListWidget::setModel(JobQueueModel *model)
{
Q_ASSERT(model);
if(model != m_jobQueueModel) {
m_jobQueueModel = model;
m_listView->setModel(model);
connect(m_listView->selectionModel(),
SIGNAL( selectionChanged(const QItemSelection&, const QItemSelection&) ),
m_jobQueueModel,
SLOT( onSelectionChanged(const QItemSelection&, const QItemSelection&) )
);
}
}
void JobListWidget::save()
{
Q_ASSERT(m_jobQueueModel);
qDebug() << "JobListWidget::save() -> ";
m_jobQueueModel->save("tmp2.xml");
}
// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
JobSelectorWidget::JobSelectorWidget(JobQueueModel *model, QWidget *parent)
: QWidget(parent)
......@@ -97,7 +25,7 @@ JobSelectorWidget::JobSelectorWidget(JobQueueModel *model, QWidget *parent)
setModel(model);
setMinimumSize(128, 600);
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
setWindowTitle(QLatin1String("Job Selector"));
setObjectName(QLatin1String("Job Selector"));
// setStyleSheet("background-color:white;");
......@@ -105,6 +33,7 @@ JobSelectorWidget::JobSelectorWidget(JobQueueModel *model, QWidget *parent)
m_splitter->setOrientation(Qt::Vertical);
m_splitter->addWidget(m_jobListWidget);
m_splitter->addWidget(m_jobProperties);
m_splitter->setChildrenCollapsible(true);
QVBoxLayout *mainLayout = new QVBoxLayout;
mainLayout->setMargin(0);
......
......@@ -6,33 +6,8 @@
class JobQueueModel;
class JobPropertiesWidget;
class QSplitter;
class QListView;
class QPushButton;
//! Widget to select JobQueueItem in a list
//! Top left corner of JobQueueView
//! Part of JobSelectorWidget
class JobListWidget : public QWidget
{
Q_OBJECT
public:
explicit JobListWidget(QWidget *parent = 0);
void setModel(JobQueueModel *model);
public slots:
private slots:
void save();
private:
JobQueueModel *m_jobQueueModel;
QListView *m_listView;
QPushButton *m_button1;
QPushButton *m_button2;
QPushButton *m_saveButton;
};
class JobListWidget;
//! Widget to select JobQueueItem in a list and display its properties
......@@ -45,6 +20,9 @@ public:
void setModel(JobQueueModel *model);
QSize sizeHint() const { return QSize(128, 600); }
QSize minimumSizeHint() const { return QSize(64, 300); }
private:
JobQueueModel *m_jobQueueModel;
QSplitter *m_splitter;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment