各位:
遇到一個問題一直迷惑,請教一下:
下面是寫的一個測驗類
.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回圈給阻塞了呢?
uj5u.com熱心網友回復:
不會的,要呼叫QCoreApplication::processEvents才能在while里維持訊息回圈
uj5u.com熱心網友回復:
版主你好,這個QCoreApplication::processEvents我試用了一下,雖然用了它可以觸發到 槽函式,但是有一個很好的問題:
槽函式的觸發的時間 會 跟 while回圈 里的sleep有關系,
如果我在while里sleep了2秒,槽函式的觸發延遲會很明顯,
所以這個方式感覺不太好。
movetothread方式的執行緒里+while回圈 大家一般都是怎么解決這種2個執行緒間通訊的呢?比如我2個執行緒都是 while回圈?
(繼承QThread方式的執行緒倒是不存在阻塞槽函式的問題,因為那種方式其它槽函式都屬于主執行緒,run里+while并不會影響到)
uj5u.com熱心網友回復:
網上也看到有說 執行緒+定時器,這樣感覺不是太好吧?轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/259598.html
標籤:Qt
上一篇:imageview顯示bitmap出現黑屏卡死的問題,就是調取攝像頭,將獲取的bitmap通過遍歷找到出現最多的顏色,再將bitmap顯示出來
