微信开发商成都网站seo外包
web/
2025/10/5 22:28:38/
文章来源:
微信开发商,成都网站seo外包,旅游网站建设启动方案,完美动力培训机构目录
1. 问题现象
2. 原因分析
3. 解决方法 1. 问题现象 因为业务需求#xff0c;需要利用子线程向主线程发送数据。像这种子线程和主线程进行数据交互时#xff0c;一般都是通过Qt的信号槽机制来实现。如下代码#xff1a;
void myClass::doBusiness()
{…目录
1. 问题现象
2. 原因分析
3. 解决方法 1. 问题现象 因为业务需求需要利用子线程向主线程发送数据。像这种子线程和主线程进行数据交互时一般都是通过Qt的信号槽机制来实现。如下代码
void myClass::doBusiness()
{...... // 其它代码略connect(this, myClass::mySignal, m_pBusiness, CMyBusiness::processBusiness);// 开启业务数据线程auto pDataThread new std::thread(myClass::dataThreadFun, this);...... // 其它代码略}// 数据线程函数
void myClass::dataThreadFun()
{// 无限循环一直处理业务while (true){...... // 其它代码略char* p data; // data数据在while的每轮循环中都会被更改emit mySignal(p);}
}// 业务处理类位于主线程
void CMyBusiness::processBusiness(char* pData)
{// 取出pData做一些处理
}
其中m_pBusiness为CMyBusiness类对象在线程函数dataThreadFun中的以参数p发送信号mySignal以让CMyBusiness类的processBusiness(char* pData)得以执行但测试发现在processBusiness函数中参数pData和mySignal信号发送过来的数据不一样数据被更改了。
2. 原因分析 问题的原因是第5行connect信号槽时采用默认连接方式即Qt::AutoConnection方式Qt官方对该方式的说明如下 (Default) If the receiver lives in the thread that emits the signal, Qt::DirectConnection is used. Otherwise, Qt::QueuedConnection is used. The connection type is determined when the signal is emitted. 即如果接收信号的对象和发送信号的对象位于同一个线程则采取Qt::DirectConnection连接否则就采取Qt::QueuedConnection方式。当信号被发送时Qt会探测以决定采取Qt::DirectConnection连接方式还是采取Qt::QueuedConnection连接方式。 对上面的代码段CMyBusiness即为接收信号的对象m_pBusiness位于主线程发送信号对象位于子线程根据上面的说明所以第5行的connect采取的是Qt::QueuedConnection连接类型。而Qt对Qt::QueuedConnection的解释如下 The slot is invoked when control returns to the event loop of the receivers thread. The slot is executed in the receivers thread. 意思是说当控制返回接收对象的事件循环时槽函数才会被执行槽函数是在接收者所在线程执行的 。也就说Qt::QueuedConnection连接模式就是把信号类似事件放到接收者的事件队列中仅仅只是放入但不是立即执行而是等循环到该信号事件时才执行这就会和上面代码的dataThreadFun表示的子线程产生一个时间差就是在这个时间内数据被更改了其是通过上面代码的22行更改的。
3. 解决方法 解决该问题的方法是上面第5行的connect函数最后一个参数不要采用默认的Qt::AutoConnection连接方式而是采用Qt::BlockingQueuedConnection连接方式。Qt官方对Qt::BlockingQueuedConnection解释如下 Same as Qt::QueuedConnection, except that the signalling thread blocks until the slot returns. This connection must not be used if the receiver lives in the signalling thread, or else the application will deadlock. 意思是说同Qt::QueuedConnection类似唯一不同的是发送信号的线程将会一直阻塞直到接收信号的槽函数执行后才继续往下执行。这种连接方式不能用于接收信号的对象和发送信号对象都在同一个线程的情况否则会引起死锁。 采取Qt::QueuedConnection连接方式后上面的子线程dataThreadFun在发送信号后会阻塞直到CMyBusiness类的processBusiness函数执行后才继续往下执行所以数据就不会被更改。
Qt::BlockingQueuedConnection连接方式不能用于接收信号的对象和发送信号对象都在同一个线程的情况否则会引起死锁这很好理解如果位于同一线程就会造成你等我我也等你大家相互等待对方执行完后再执行就会造成死锁。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/87591.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!