关于Qt线程的使用

    线程一直是所有程序语言的一个重点内容,今天我来说一说Qt里使用线程时的一些需要注意的内容。

    首先,Qt使用线程时最让人烦恼的是线程与其他类之间的相互调用,我们创建线程来使界面内的一些功能能够异步运行,以减轻程序的负担,避免程序崩溃,此时普通的界面类需要调用线程类来使线程运行,而线程则需要调用界面类来实现界面的异步功能,而Qt的特殊机制致使两个类无法互相调用,此时,我知道的方法有两种:

1.互相调用头文件

    Qt两个头文件无法互相以#include "xxx.h" 和#include "yyy.h"的方式来互相调用,这个时候我们需要以以下方式:

     在yyy.h头文件内输入class xxx;

                                       #include "xxx.h"

    在xxx.h头文件内输入class yyy;

                                    #include "yyy.h"

2.将线程设置为需要调用的类的友元类

     友元类可以访问对应的类的所有资源,这样我们就可以使线程和对应的类互相调用了,代码如下:

public:
	friend class Thread;

	class Thread :public QThread
	{
	public:
		QString ErrorMessage = "";
		TestDialog* test_dialog;
		Thread(TestDialog* test_dialog_)
		{
			test_dialog = test_dialog_;
		}
		void run() override;
	};

    如代码,我们创建一个界面类对象,然后将需要互相调用的界面类赋值给它,这样线程就可以通过这个类对象直接操作对应的界面类了。同时该线程的类名为TestDialog::thread.

     然后是怎样使一个线程暂停。

    Qt使一个线程暂停的方法其实很简单,我们创建一个QMutex类对象,也就是线程锁,然后在线程的run函数内添加线程锁的开锁和解锁操作,当我们需要暂停线程时,将线程锁锁住,否则打开,代码如下:

for (auto i = 0; i < count; i++)
{
	test_dialog_->TestThreadMutex.lock();
	if (!flag)
	{
		xxxxxx;
	}
	test_dialog_->TestThreadMutex.unlock();
}
void TestDialog::PauseSlot()
{
	static bool pause_flag = false;
	if (!pause_flag)
	{
		test_dialog->PauseButton->setIcon(QIcon(":/Start.png"));
		test_dialog->PauseButton->setText("开始");
		pause_flag = true;
		test_dialog->TestThreadMutex.lock();
	}
	else if (pause_flag)
	{
		test_dialog->PauseButton->setIcon(QIcon(":/Pause.png"));
		test_dialog->PauseButton->setText("暂停");
		pause_flag = false;
		test_dialog->TestThreadMutex.unlock();
	}
	
}
     暂时就这些吧,至于线程的创建和停止就不说了,其他的难的等我学会吧,毕竟我还只是个菜鸡而已。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值