QT 线程之 moveToThread()

灰太狼 2022-06-05 04:49 428阅读 0赞

直接进入主题:

基本用法,新建一个Widget类(父类无要求) ,在此基础上新建一个TestThread(必须继承自 QObject),

在Widget类构造函数里做如下处理:

  1. m_TestThread = new TestThread();
  2. m_thread = new QThread();
  3. m_TestThread ->moveToThread(m_thread);
  4. m_thread->start();//以上是必须滴
  5. connect(this,SIGNAL(startThread()),m_TestThread ,SLOT(threadStart()));
  6. emit startThread(); //发送信号,执行槽函数threadStart()
  7. int i= 0;
  8. while(1){
  9. qDebug() <<"mainThread:"<<i++<<QThread::currentThreadId()<< endl;
  10. QThread::msleep(1000);
  11. }

TestThread类threadStart()槽函数代码

  1. int i = 0;
  2. while(1){
  3. qDebug() <<"m_thread:"<< i++<< QThread::currentThreadId()<< endl;
  4. QThread::msleep(1000);
  5. }

结论一:
这里写图片描述
可以发现,主线程并没有因为threadStart()的死循环而被阻塞,两段代码是运行在不同的线程中。

结论二:
如果将上述emit startThread(); 改为 m_MainThread->threadStart();
即直接调用函数的方式,而非槽函数。结果如下:
这里写图片描述
可以看出:通过调用函数的方式时,主线程被阻塞,也就是说,调用的函数没有运行在另一个线程中,而是在主线程。

说明:

  1. 线程函数的 while循环结束 并不代表 线程结束
    2.m_thread->isRunning() 可以判断 线程是否在运行
    3.m_thread->isFinished() 可以判断 线程 是否结束
    4.started() 线程被start时触发的信号
    5.finished() 线程被stop时触发的信号
    6.线程退出的方法
    m_thread->quit();
    m_thread->exit();
    两者异同暂不讨论
    7.等待线程结束,即阻塞
    m_thread->wait()

发表评论

表情:
评论列表 (有 0 条评论,428人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Qt线

    今天学习Qt的多线程,在学习多线程主要是两个方面。一是多线程的基础概念,二是多线程的同步,三是怎么和主线程进行通讯。 三.Qt 的应用程序开始执行的时候,只有一个主线程在运行