目录
1、QThread介绍
QThread类提供了一个与平台无关的管理线程的方法。一个QThread对象管理一个线程。QThread的执行从run()函数的执行开始,在Qt自带的QThread类中,run()函数通过调用exec()函数来启动事件循环机制,并且在线程内部处理Qt的事件。在Qt中建立线程的主要目的就是为了用线程来处理那些耗时的后台操作,从而让主界面能及时响应用户的请求操作。
QThread的使用方法有如下两种:
①、QObject::moveToThread()
②、继承QThread类
下面讲解第二种方法
1.2、继承Qthread类
先添加一个C++的文件
要添加下列句子才能支持信号与槽
//定义虚函数run()用来执行线程
protected:
virtual void fun();
//定义函数设置名字
private:
QString threadName;
public:
void setThreadName(QString);
void MyThread::setThreadName(QString name)
{
threadName = name;
}
//实现run函数
void MyThread::run()
{
qDebug()<<"MyThread::run:"<<QThread::currentThreadId();
while(1)
{
qDebug() << threadName << "I'am A thread";
QThread::sleep(1);
}
}
//执行线程
MyThread thread1;
thread1.setThreadName("thread1");
thread1.start();
MyThread thread1;
thread1.setThreadName("thread2");
thread1.start();
对上面的参数进行介绍:
1.2.1、得到线程id
//在之前实现的每一个函数函数中都加上输出,这样就能直到执行这个函数的线程id了
qDebug()<<"函数的名字"<<QThread::currentThreadId();
1.2.2、让线程一直执行
run情况下,就在里面加上一个while(1)一直执行
里面加一个sleep(),让他不要一直占cpu
1.2.3、线程退出
exit()//退出
wait(1000) // 等一秒,然后退出
1.2.4、connect的第五个参数
这个参数在线程中才用的到,表示线程的一个连接方式
一般的话,就是自动连接,也就是第五个参,不用填。
1.2.5、线程锁 QMutex
用线程还是会遇到访问共同资源的问题,如果遇到还是需要锁
QMutex类提供了一种保护一个变量或者一段代码的方法,这样可以每次只让一个线程访问它。这个 类提供了一个lock()函数用于锁住互斥量,如果互斥量是解锁状态,那么当前线程立即占用并锁定它;否则,当前线程会阻塞,直到这个互斥量的线程对它解锁为止。QMutex类还提供了一个tryLock()函数, 如果该互斥量已经锁定,它就会立即返回。
void MyThread::run()
{
qDebug()<<"MyThread::run"<<QThread::currentThreadId();
while(1)//用while会让他一直跑
{
mutex.lock();
x++;
qDebug()<<threadName<<x<<QThread::currentThreadId();
mutex.unlock();
QThread::sleep(1);
}
}