QThread的用法:开启与退出

QThread有两种用法,

一、用moveToThread()将功能类移入到线程QThread中,这个用法可以参照这篇博客:http://blog.csdn.net/lynfam/article/details/7081757,文章讲的深入浅出,层层递进,非常值得一读;
二、还有一种方法就是继承QThread,在run函数中实现子线程,本文主要是讲这种方法的注意事项。

QThread::run()是子线程的入口函数,子线程的所有变量都需要在run()函数中声明与定义。为了实现子线程的循环运行,可以用两种方法:1、用while()循环,实现子线程的重复运行;2、在run()函数中实现事件循环。
方法1就是主要用于轮询或周期处理功能,代码实现简单,这里就不再介绍,
方法2需要在run()函数中实现事件循环,同时退出时还需要清理线程内容,下面就用代码演示一下。

void GSPChannel::run()
{
    QTimer timer;
    bool res = connect(&timer,SIGNAL(timeout()),gspProcess,SLOT(SlotTimeOut()),Qt::DirectConnection);
    timer.start(GSP_TIME_CYC);

    exec();
    return;
}

在run()函数中调用exec()就可以在子线程中实现了事件循环,这样子线程也拥有了自己的事件循环机制,QTimer就是在子线程中运行了。
子线程的启动如下

GSPChannel* channel = new GSPChannel(handle,ipaddr);
channel->start();

子线程从start()函数开始执行,即开始运行run()函数。

在运行结束后,需要中止子线程时用如下代码

channel->quit();
channel->wait();
delete channel;

注意:quit()函数是用来停止QThread的,但是由于Qt本身是事件循环机制,所以在调用完quit()后,QThread可能还没有完全停止,此时如果执行delete channel,程序就会报错。在执行quit()后,调用wait()来等待QThread子线程的结束(即从run()函数的返回),这样就能保证在清除QThread时,其子线程是停止运行的。

你可能感兴趣的:(线程,QThread,qt)