加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

qt moveToThread的用法

(2017-10-08 14:43:25)
标签:

it

这里的示例功能:
在子线程中用一个死循环,将int中的奇数值传到主线程中去,子线程每计算完一次休息2秒



--------------------------------------------MainWindow--------------------------------------------
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    CMyCalc m_calc;

signals:
    void s_start();

private slots:
    void onRead(int);
    //开始接收
    void on_pushButton_clicked();
    //取消接收
    void on_pushButton_2_clicked();
};


MainWindow::MainWindow(QWidget *parent) :

    QMainWindow(parent),

    ui(new Ui::MainWindow)

{

    ui->setupUi(this);

    //相当于执行QThread的run函数

    connect(this , SIGNAL(s_start()) , &m_calc , SLOT(onStart()));

}



MainWindow::~MainWindow()

{

    delete ui;

}



void MainWindow::onRead(int iData)

{

    qDebug() << iData;

}



void MainWindow::on_pushButton_clicked()

{

    //绑定信号与槽

    connect(&m_calc , SIGNAL(s_sig(int)) , this , SLOT(onRead(int)));

    emit s_start();

}



void MainWindow::on_pushButton_2_clicked()

{

    //取消信号与槽

    disconnect(&m_calc , SIGNAL(s_sig(int)) , 0, 0);

}


--------------------------------------------CMyCalc--------------------------------------------

class CMyCalc : public QObject

{

    Q_OBJECT

public:

    explicit CMyCalc(QObject *parent = 0);



private:

    QThread*    m_pThread;



public:

    void calc();



signals:

    void s_sig(int);



public slots:

    void onStart();

};


CMyCalc::CMyCalc(QObject *parent) : QObject(parent)

{

    m_pThread = new QThread;

    this->moveToThread(m_pThread);

    m_pThread->start();

}



void CMyCalc::calc()

{

    int i = 0;

    while(1)

    {

        if((i++) % 2 == 0)

        {

            emit s_sig(i);

            Sleep(2000);

        }

    }

}



void CMyCalc::onStart()

{

    calc();

}


在对QThread的理解存在着一些误区,需要特别说明一下:
1.QThread只是一个管理线程的类,不是QThread的函数就是多线程,只有run中的东西才存在于多线程中;
2.在使用moveToThread的时候,耗时的或者说是死循环的类moveToThread到多线程中;然后,使用信号与槽的方式进行对该类进行调用

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有