标题:Qt多线程异步处理进度条
作者:lwei24
日期:2021-05-17 09:44
内容:
各位大佬,目前在QTableWidget上使用多线程异步处理多个进度条,每个进度条都有自己的进度,并且互不影响,要怎么做才能实现呢?
#1 [clickto 05-17 15:08]
通过信号,每个进度条接受自己的工作线程的进度
#2 回 clickto 的帖子 [lwei24 05-20 19:09]
clickto:通过信号,每个进度条接受自己的工作线程的进度 (2021-05-17 15:08)
目前我就是用多线程,每个线程有自己的进度条,并每个进度条有自己的进度,但是由于要插入到表格QTableWidget中,但是有个问题,就是每次插入QTableWidget,由于线程有多个,可能会插入多个进度条,存在进度条之间重复利用,即错位的情况,比如说,第三个的进度条没有显示,跑到第二个进度条里显示了。。。
#3 回 lwei24 的帖子 [clickto 05-20 23:00]
lwei24:
目前我就是用多线程,每个线程有自己的进度条,并每个进度条有自己的进度,但是由于要插入到表格QTableWidget中,但是有个问题,就是每次插入QTableWidget,由于线程有多个,可能会插入多个进度条,存在进度条之间重复利用,即错位的情况,比如说,第三个的进度条没有显示,跑到第二个进度条里显示了。。。
???不太明白你的意思。应该是每个进度条有确定的线程进来行计算值。
我这里给写了一个简单的例子,只产生3个单元格,每个单元格一个线程,不断的变化进度条的值,并不会出现你说的情况,可以看看。
要说明的是,由于使用时间做种子,导致随机数并不那么随机,所以我人为的做了些区别,但这并不影响其实质,3个进度条由3个线程产生值。
呃,,还是无法上传附件,我放这里了:http://91io.cn/s/893qXsw
#4 回 clickto 的帖子 [lwei24 05-21 12:00]
clickto:
???不太明白你的意思。应该是每个进度条有确定的线程进来行计算值。
我这里给写了一个简单的例子,只产生3个单元格,每个单元格一个线程,不断的变化进度条的值,并不会出现你说的情况,可以看看。
要说明的是,由于使用时间做种子,导致随机数并不那么随机,所以我人为的做了些区别,但这并不影响其实质,3个进度条由3个线程产生值。
呃,,还是无法上传附件,我放这里了:http://91io.cn/s/893qXsw
大佬,刚刚看了你写的,的确可以多线程中一个线程控制一个进度条。
我的代码主要代码如下:
class myWidget : public QWidget
{
Q_OBJECT
public:
myWidget(QWidget *parent = nullptr);
~myWidget();
private:
QLineEdit *m_lineEdit;
eCustomTableWidget *m_eTableWidget;
int m_threadCount;
signals:
void sigStartTask(int num);
};
myWidget::myWidget(QWidget *parent)
: myWidget(QWidget)
{
m_lineEdit = new QLineEdit(this);
m_lineEdit->resize(40,40);
m_lineEdit->move(this->width()*20/100, this->height()*20/100);
m_threadCount = QString(m_lineEdit->text()).toUInt();
m_eTableWidget = new eCustomTableWidget(this);
m_eTableWidget->resize(this->width()*85/100, this->height()*65/100);
m_eTableWidget->move(this->width()*20/100, this->height()*25/100);
}
myWidget::~myWidget()
{
}
void myWidget::clickedBtn1()
{
connect(this, &clickedBtn1::sigStartTask, m_eTableWidget, &eCustomTableWidget::startTask);
  ..
#5 [deepgui 05-23 02:48]
使用mutex保证一个线程改变table, 更新后允许下一个线程做改变