以下是单线程的程序,每次程序进到循环里,会出现睡眠假死的操作。
#ifndef MYCLASS_H
#define MYCLASS_H
#include <QtWidgets/QWidget>
#include <Windows.h>
#include "ui_myclass.h"
class MyClass : public QWidget
{
Q_OBJECT
public:
MyClass(QWidget *parent = 0);
~MyClass();
public slots:
void OnBtnLongTimeClicked();
private:
Ui::MyClassClass ui;
};
#endif
#include "myclass.h"
MyClass::MyClass(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
connect(ui.btnTime, SIGNAL(clicked()), this, SLOT(OnBtnLongTimeClicked()));
}
MyClass::~MyClass()
{
}
void MyClass::OnBtnLongTimeClicked()
{
for (int i = 0; i < 3; ++i)
{
Sleep(1000);
}
}
#include "myclass.h"
#include <QtWidgets/QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyClass w;
w.show();
return a.exec();
}
改进后的程序,实现了以下的功能:程序运行后,点击“启动线程”,则会在工作线程中对计数器累加,并把计数器结果通过信号传递给UI主线程,主线程收到计数器的值后,将该值在LCD屏幕上显示。点击“终止线程”时,LCD屏幕的数字不再改变。如此反复。
#ifndef MYCLASS_H
#define MYCLASS_H
#include <QtWidgets/QWidget>
#include <Windows.h>
#include <QThread>
#include "ui_myclass.h"
class WorkThread;
class MyClass : public QWidget
{
Q_OBJECT
public:
MyClass(QWidget *parent = 0);
~MyClass();
public slots:
void OnBtnLongTimeClicked();
void OnBtnSopClicked();
void OnGetLCDNum(int);
private:
Ui::MyClassClass ui;
WorkThread* m_myWorkThread;
};
class WorkThread : public QThread
{
Q_OBJECT
protected:
void run();
signals:
void sgnLCDNum(int);
};
#endif
#include "myclass.h"
#include <QMessageBox>
int iCnt = 0;
bool bWorkThreadStop = false;
MyClass::MyClass(QWidget *parent)
: QWidget(parent)
, m_myWorkThread(NULL)
{
ui.setupUi(this);
m_myWorkThread = new WorkThread;
bool r2 = connect(ui.btnTime, SIGNAL(clicked()), this, SLOT(OnBtnLongTimeClicked()));
bool r1 = connect(ui.btnStop, SIGNAL(clicked()), this, SLOT(OnBtnSopClicked()));
bool r = connect(m_myWorkThread, SIGNAL(sgnLCDNum(int)), this, SLOT(OnGetLCDNum(int)), Qt::QueuedConnection);
}
MyClass::~MyClass()
{
if (m_myWorkThread)
{
m_myWorkThread->quit();
m_myWorkThread->wait();
}
delete m_myWorkThread;
m_myWorkThread = NULL;
}
void MyClass::OnBtnLongTimeClicked()
{
bWorkThreadStop = false;
m_myWorkThread->start();
}
void MyClass::OnBtnSopClicked()
{
bWorkThreadStop = true;
}
void MyClass::OnGetLCDNum(int num)
{
ui.lcdNumber->display(num);
}
void WorkThread::run()
{
for (int i = 0; i < 100; ++i)
{
if (bWorkThreadStop)
{
break;
}
Sleep(1000);
++iCnt;
emit sgnLCDNum(iCnt);
}
}
#include "myclass.h"
#include <QtWidgets/QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyClass w;
w.show();
return a.exec();
}
