各位大佬,请大家指点一下:如下代码,在Qt平台下,多线程通过数组的方式创建,每个多线程都有自己的工作线程,每个工作线程都有一个对应的进度条,以上代码中出现的问题是多个进度条值可能会错乱,例如
当有两个进度条时,进度条1可能从1%递增到100%后再降到1%,最后再递增到100%(或者递增过程中出现失败),进度条2从1%递增到100%,正常显示。
为什么每个工作线程对应一个进度条,某个进度条的值还是会递增两次或多次呢?后来,我检查了代码,在每次处理进度条达到100%后,退出该线程,结果,还是会接受到工作线程的信号,导致进度条重新从1%计算开始。是不是由于每个工作线程的信号都是一样的影响了呢?有什么办法解决这个问题吗?或者有什么更好的办法实现多线程处理多个进度条值而不会错乱吗?欢迎各位大佬赐教,小弟不胜感激!!!!
/*****************************/
//Worker类
class Worker : public QObject
{
Q_OBJECT
public:
Worker(QTableWidgetItem *pItem0, QProgressBar *pProgressBar);
public slots:
void slotStartWork();
signals:
void sigProgressValue(QProgressBar *pProgressBar, int nCode);
void sigStartWork(); private:
QTableWidgetItem *m_item0;
QProgressBar *m_progressBar;
}; Worker::Worker(QTableWidgetItem *pItem0, QProgressBar *pProgressBar)
{
m_item0 = pItem0;
m_progressBar = pProgressBar;
} void Worker::slotStartWork()
{
//dosomething
if(true)
{
emit sigProgressValue(m_progressBar, i)//成功,返回进度条值,从1递增100.
}
else
{
emit sigProgressValue(m_progressBar, -1);//失败
}
}
/*****************************/ //CustomTableWidget类
class CustomTableWidget : public QTableWidget
{
QOBJECT
public:
CustomTableWidget(QWidget *parent = nullptr);
~CustomTableWidget();
public slots:
void slotProgressValue(QProgressBar *pProgressBar, int nCode);
void slotWorkerNullptr();
signals:
void sigStartWork();
private:
QVector<QTableWidgetItem *> m_vItem0;
QVector<QProgressBar *> m_vProgressBar;
QVector<Worker *> m_vWorker;
QVector<QThread *>m_vThread;
} CustomTableWidget::CustomTableWidget(QWidget *parent)
TableWidget(parent)
{ } CustomTableWidget::~CustomTableWidget()
{
for(int i = 0; i < m_vThread.size(); i++)
{
if(m_vThread != NULL)
{
if(m_vWorker != NULL)
{
m_vWorker->stop();
} if(m_vThread->isRunning())
{
m_vThread->quit();
m_vThread->wait();
}
}
}
} void CustomTableWidget::startCalcProgressBar()
{
m_vItem0.resize(threadCount);
m_vItem0.resize(threadCount);
m_vWorker.resize(threadCount);
m_vThread.resize(threadCount);
for(int i = 0; i < threadCount; i++)
{
m_vItem0 = new QTableWidgetItem();
m_vItem0->setText(QStringLiteral("进度条%1").arg(i));
m_vItem0->setTextAlignment(Qt::AlignCenter);
m_vProgressBar = new QProgressBar(this);
m_vProgressBar->setStyleSheet("QProgressBar{border:none;border-radius:5px;text-align:center;color:white;}"
"QProgressBar::chunk{background-color:#003DA6;width:20px;}");
m_vProgressBar->setFont(m_font);
m_vProgressBar->setMinimum(0);
m_vProgressBar->setMaximum(100);
m_vProgressBar->setAlignment(Qt::AlignCenter);
m_vProgressBar->setValue(0);
if(m_vWorker == NULL)
{
m_vThread = new QThread(this);
m_vWorker = new Worker(m_vItem0, m_vProgressBar);
m_vWorker->moveToThread(m_vThread);
connect(m_vThread, &QThread::finished, m_vWorker, &Worker::deleteLater);
connect(m_vThread, &QThread::finished, this, &CustomTableWidget::slotWorkerNullptr);
connect(m_vWorker, &Worker::sigProgressValue, this, &CustomTableWidget::slotProgressValue);
connect(this, &CustomTableWidget::sigStartWork, m_vEncryptWorker, &encryptWorker::slotStartWork);
m_vThread->start();
}
emit sigStartWork();
}
} void CustomTableWidget::slotWorkerNullptr()
{
for(int i = 0; i < m_vWorker.size(); i++)
{
if(m_vWorker != NULL)
{
m_vWorker = NULL;
}
}
} void CustomTableWidget::slotProgressValue(QProgressBar *pProgressBar, int nCode)
{
if(nCode < 0)
{
//显示失败
pProgressBar->setValue(0);
for(int i = 0; i < m_vThread.size(); i++)
{
if(m_vThread->isRunning())
{
m_vThread->exit(nCode);
}
}
}
pProgressBar->setValue(nCode);
if(nCode == 100)
{
//显示成功
pProgressBar->setValue(100);
//位置1
/*
for(int i = 0; i < m_vThread.size(); i++)
{
if(m_vThread->isRunning())
{
m_vThread->exit(0);
}
}
*/
}
}
|