Qt Quick快速入门之线程基础

  首先必须明确的是,Qt中的线程使用是相对复杂的,并不像C#中那么随意,特别是结合串口、网络编程等,使用时稍有不慎就会出问题,而后Qt里面常常出了问题就直接崩溃(这个真是谁用谁知道),因此若是在功能上用异步方式能作到其实就不必本身去开线程,固然若是本身写的函数比较耗时(好比不断地循环作操做之类的)就没法避免使用线程了。编程

  Qt中通常将耗时操做单独放在一个类中实现,在主线程中建立类对象,而后将这个对象移到子线程中,主线程与子线程间的通讯主要经过信号和槽实现。另外对象是在主线程中建立的,对象中的成员都属于主线程,在主、子线程中均可以直接访问,不过若是你把对象中的成员也移到子线程中,那么在主线程就不能直接访问这个成员了。网络

  下面是一个使用实例。异步

class ThreadManager : public QObject
{
    Q_OBJECT
    QThread workerThread;
public:
    ThreadManager();
    ~ThreadManager();
    MyWorker * worker;
signals:
    void start();
public slots:
    void emitstart();
    void emitstop();

    void printThreadId(int count);
};
ThreadManager::ThreadManager()
{
    worker = new MyWorker();
    worker->moveToThread(&workerThread);
    connect(this,SIGNAL(start()),worker,SLOT(Start()));
    connect(worker,SIGNAL(invokeParentThreadMethod(int)),this,SLOT(printThreadId(int)));
    workerThread.start();
}

ThreadManager::~ThreadManager()
{
    workerThread.quit();
}

void ThreadManager::emitstart()
{
    emit start();
}

void ThreadManager::emitstop()
{
    worker->stoped = true;
    qDebug()<<"中止";
}

void ThreadManager::printThreadId(int count)
{
    //worker->stoped = true;
    qDebug()<<QThread::currentThreadId()<<"\t"<<count;
}

ThreadManager 用来开启一个新的线程,而后在这个线程里面执行其余操做,下面是执行操做的类 MyWorker。函数

 

class MyWorker : public QObject
{
    Q_OBJECT
public:
    explicit MyWorker(QObject *parent = 0);
    bool stoped;
signals:
    void invokeParentThreadMethod(int count);
public slots:
    void Start();
};
MyWorker::MyWorker(QObject *parent) :
    QObject(parent)
{
    stoped = false;
}

void MyWorker::Start()
{
    int count =0;
    stoped = false;
    while(!stoped)
    {
        qDebug()<<QThread::currentThreadId()<<"\t"<<count++;
        emit invokeParentThreadMethod(count);
        QThread::msleep(500);
    }
}


再看看咱们在主线程中如何使用的ui

    QObject* win = engine.rootObjects()[0];
    QObject* Button_Start = win->findChild<QObject*>("Button_Start");
    QObject* Button_Stop = win->findChild<QObject*>("Button_Stop");

    ThreadManager* therad = new ThreadManager();
    QObject::connect(Button_Start,SIGNAL(clicked()),therad,SLOT(emitstart()));
    QObject::connect(Button_Stop,SIGNAL(clicked()),therad,SLOT(emitstop()));

这里只是一个很简单的线程使用示例,在串口、网络编程时每每涉及到线程同步、资源共享、线程通讯等问题,好比子线程还在使用资源主线程却将资源释放了或是线程间通讯时传过去的数据发生了变化等等,具体状况只有结合本身经验去分析了。this

相关文章
相关标签/搜索