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到多线程中;然后,使用信号与槽的方式进行对该类进行调用
前一篇:linux下USB端口的绑定
后一篇:qt http 超时处理