Qt里线程中while循环阻塞信号槽问题
iperf 2021-02-13 10:15:37 各位:
遇到一个问题一直迷惑,请教一下:
下面是写的一个测试类
.h
class WorkPro : public QObject
{
Q_OBJECT
public:
explicit WorkPro(QObject *parent = nullptr);
~WorkPro();
void StopThread();
signals:
void reaustReadySignal(int);
public slots:
void DoWork();
void OnReceivedThreadOperate(int);
private:
QMutex m_Mutex;
bool m_bThreadRunFlag;
.cpp相关代码
void WorkPro::StopThread()
{
m_bThreadRunFlag = false;
}
void WorkPro::DoWork()
{
static int iCount =0;
while(m_bThreadRunFlag)
{
qDebug()<<"Run DoWrok..."<<QThread::currentThread();
iCount++;
emit reaustReadySignal(iCount);
QThread::msleep(1000);
}
}
void WorkPro::OnReceivedThreadOperate(int threadOpera)
{
qDebug()<<"Recvd OnReceivedThreadOperate";
if(threadOpera == 0)
{
qDebug()<<"Pause Thread";
}
else
{
qDebug()<<"Resume Thread";
}
}
在对话框类中使用该类,点击按钮触发:
void Dialog::on_startBTN_clicked()
{
m_pWork = new WorkPro();
m_pWork->moveToThread(&m_workThread);
connect(&m_workThread, &QThread::finished, m_pWork, &QObject::deleteLater);
connect(&m_workThread, &QThread::started, m_pWork, &WorkPro::DoWork);
connect(m_pWork,&WorkPro::reaustReadySignal,this,&Dialog::OnReceivedThreadData);
connect(this,SIGNAL(threadOperateSignal(int)),m_pWork,SLOT(OnReceivedThreadOperate(int)));
m_workThread.start();
m_bThreadPauseFlag = true;
}
void Dialog::on_pauseBTN_clicked()
{
if(m_workThread.isRunning())
{
if(m_bThreadPauseFlag)
{
emit threadOperateSignal(0);// 0 暂停
qDebug()<<"Send Pause Signal";
ui->pauseBTN->setText("恢复");
m_bThreadPauseFlag = false;
}
else
{
emit threadOperateSignal(1);// 0 暂停
qDebug()<<"Send Resume Signal";
ui->pauseBTN->setText("暂停");
m_bThreadPauseFlag = true;
}
}
}
问题是:
按钮点击暂停触发on_pauseBTN_clicked()函数
这里面发送的信号threadOperateSignal,我在WorkPro类中确收不到,
原因应该是WorkPro中的DoWork()槽里使用了while循环,
迷惑的是我不是在循环里sleep了吗?sleep 不是会把CPU时间片占用权交出来,
这样事件循环不是有机制执行了?
还是说sleep本身阻塞的就是事件循环?
事件循环不是QObject控制的么?这个强大的一个类,怎么能随便就会被一个子线程的while循环给阻塞了呢?