线程一直是所有程序语言的一个重点内容,今天我来说一说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();
}
}
暂时就这些吧,至于线程的创建和停止就不说了,其他的难的等我学会吧,毕竟我还只是个菜鸡而已。