【QT】關於定時器進行延時,不阻塞主線程 總結

參考:

1、foo__hack

https://www.cnblogs.com/foohack/p/7449614.html

2、鬼馬行天

https://blog.csdn.net/hanshuobest/article/details/51494743

3、嚇人的猿

https://blog.csdn.net/qq769651718/article/details/79357933

4、一去丶二三裏

https://blog.csdn.net/liang19890820/article/details/51789796

 

正文:

首先,先進行關於將問題說明,我要解決的是在顯示界面中一個label控件中顯示一個NG,但是沒有一個合適的信號去把他置回。而後,還不能夠讓主線程給阻塞掉。

看到論壇中有這樣的一個方法:

1、第一種,阻塞主線程,最簡單的延時方法就是使用QThread類的sleep(n)、msleep(n)、usleep(n)

QThread::msleep(50);//阻塞延時50ms

2、第二種,不阻塞主線程

void Delay_MSec(unsigned int msec)
{
    QTime _Timer = QTime::currentTime().addMSecs(msec);
    while( QTime::currentTime() < _Timer )
        QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
}

 

我的解決辦法:就還是想着將QTimer放在子線程中。

之前做過一個小的Demo,如果線程阻塞會出現主界面不能夠點擊任何的空間,也就會阻塞主線程。

隨便打開一個例程:

添加一個類,將其準備做成子線程。

//mytest.h

#ifndef MYTEST_H
#define MYTEST_H
#include <QTimer>
#include <QObject>

class Mytest : public QObject
{
    Q_OBJECT
public:
    Mytest();

signals:
     void send_test();

public slots:
    void dataCollectionSendTask();

private:
    QTimer m_task_timer;


};

#endif // MYTEST_H

mytest.cpp

#include "mytest.h"

Mytest::Mytest()
{
    //m_task_timer.setInterval(5000);
    m_task_timer.singleShot(5000, this, SLOT(dataCollectionSendTask()));
    // connect(&m_task_timer, SIGNAL(timeout()), this,    SLOT(dataCollectionSendTask()));
   //  m_task_timer.start();
}


void Mytest::dataCollectionSendTask()
{
   emit send_test();
 //調用網絡接口發送採集完成的數據,發送的服務器
}

在主界面中的操作,實例化類對象:

給出的效果就是,程序運行5s後,會將label->setText("12345678");且不會阻塞線程

end

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章