Qt:解决跨线程调用socket/IO类,导致报错的问题(socket notifiers cannot be enabled from another thread)

Qt有很多IO相关的类,比如说QTcpSocket、QFile,总的来说,在Qt的框架内使用,还是非常方便的。
但是用过其他框架IO类的人,可能有一个很不习惯,就是Qt的所有IO类,都不推荐或者不可以跨线程操作,不然就会报错,比如说操作QTcpSocket跨线程调用write接口,就会报错:

socket notifiers cannot be enabled from another thread

要解决这个问题,直观的说就是不要跨线程操作,网上也有很多类似的说明。
这也是有道理的,很多时候真的是设计问题导致的,因为设计失误出现了不应该有的跨线程操作。
当然也可以用信号和槽封装一下,但是这样会涉及很多不必要的代码,我个人觉得也太过于麻烦。
那么我这里就提供一个更简单的方法,对QTcpSocket跨线程调用代码如下:

QMetaObject::invokeMethod( &socket, std::bind( static_cast< qint64(QTcpSocket::*)(const QByteArray &) >( &QTcpSocket::write ), &socket, QByteArray( "xxxx" ) ) );

这个比 socket->write( QByteArray( "xxxx" ) ); 看起来麻烦很多,不过也

"Socket notifiers cannot be enabled or disabled from another thread"这个错误是因为在一个线程中尝试在另一个线程中启用或禁用Socket notifiers(套接字通知器)时引发的。引用中提到,当在UI线程中调用udpsocket->abort()时会出现这个问题。实际上,QtSocket notifiers是与特定线程相关联的,不能跨线程使用。 解决这个问题的方法是将Socket notifiers的操作限定在同一个线程中进行。可以考虑在同一个线程中创建并操作Socket notifiers,或者使用信号槽机制在不同线程之间进行通信。 例如,在引用中的代码中,可以将udpSocketReceiver和myUdpSocket都放在MyThread线程中创建,并确保在MyThread线程中调用udpsocket->abort()。这样就可以避免在不同线程中操作Socket notifiers导致的错误。 总结起来,要解决Socket notifiers cannot be enabled or disabled from another thread”错误,需要将Socket notifiers的操作限定在同一个线程中进行,并避免在不同线程中调用相关方法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread](https://blog.csdn.net/weixin_43820764/article/details/105887658)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值