Qt事件循环 跨线程信号和槽

MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent){pThreadCon = new CSerialThread();pThreadCon->start();m_pTimer = new QTimer();connect(m_pTimer,SIGNAL(timeout()),SLOT(onTimer()));m_pTimer->start(1000);}void MainWindow::onTimer(){m_pTimer->stop();connect(this,SIGNAL(onSignal()),g_pThread,SLOT(onTimer()),Qt::QueuedConnection);emit onSignal();this->disconnect();}void CSerialThread::run(){g_pThread = new CThread();}CThread::CThread(QObject *parent) :QThread(parent){}void CThread::onTimer(){sleep(5);qDebug("——onTimer call");}

只添加了部分代码,运行这个程序是看不到打印信息的,说明这个信号没有接收到,如果将connect最后一个参数改成直接连接,会有打印,但是主界面会卡住5秒。一直被这个问题困扰,为什么g_pThread 收不到信号呢,首先应该知道,Qt的信号和槽是基于事件循环的,就像main函数最后都会有一句return exec();这里就启动了事件循环,除了信号触发线程与接收者线程相同的情况能直接调用到slot,其它情况都依赖事件机制。QThread::run()实际上是简单调用了QThread::exec(),而它启动了线程的事件循环,,但是run()函数结束后,事件循环结束了,这个时候我们再发送信号,没有事件循环的支持,g_pThread就收不到信号了。

QThread的内部结构非常有趣:

QObject必须始终和parent在同一个线程。

所以解决上面代码收不到信号的问题其实很简单,在线程的run();函数中添加一个事件循环就可以了,即加入一句exec();

有不对的地方希望大家指正,相互学习。

版权声明:本文为博主原创文章,未经博主允许不得转载。

我们一路上兴致勃勃地参观,当夕阳西下时,才恋恋不舍地离开。

Qt事件循环 跨线程信号和槽

相关文章:

  • 【算法】直接插入排序C语言实现
  • 你感兴趣的文章:

    标签云:

    亚洲高清电影在线, 免费高清电影, 八戒影院夜间, 八戒电影最新大片, 出轨在线电影, 午夜电影院, 在线影院a1166, 在线电影院, 在线观看美剧下载, 日本爱情电影, 日韩高清电影在线, 电影天堂网, 直播盒子app, 聚合直播, 高清美剧, 高清美剧在线观看 EhViewer-E站, E站, E站绿色版, qqmulu.com, qq目录网, qq网站目录,