Qt多线程实例

以下是单线程的程序,每次程序进到循环里,会出现睡眠假死的操作。

//MyClass.h
#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 // MYCLASS_H

//MyClass.cpp
#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)
	{
		//单线程,每次循环,睡眠1s,导致程序假死。因为整个ui界面被这个循环卡住。睡眠结束后,即可恢复正常。
		Sleep(1000);
	}
}

//main.cpp
#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屏幕的数字不再改变。如此反复。

//.h
#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 // MYCLASS_H


//.cpp
#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;
		}
		//子线程,每次循环,睡眠1s,导致程序假死。因为整个ui界面被这个循环卡住。睡眠结束后,即可恢复正常。
		Sleep(1000);
		++iCnt;
		emit sgnLCDNum(iCnt);
	}
}


//main.cpp
#include "myclass.h"
#include <QtWidgets/QApplication>

int main(int argc, char *argv[])
{
	QApplication a(argc, argv);
	MyClass w;
	w.show();
	return a.exec();
}

在这里插入图片描述

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值