• 14366阅读
  • 9回复

在QThread线程中使用QTcpSocket的问题 [复制链接]

上一主题 下一主题
离线蚂蚁power
 

只看楼主 倒序阅读 楼主  发表于: 2016-01-22
功能是这样的:在run()方法中new QTcpSocket;然后监听readyRead()信号connect(m_TcpSocket,SIGNAL(readyRead()),this,SLOT(sloat_RecvData()));问题是当需要给服务器发送一段命令时(使用m_TcpSocket->write(byteArray);)程序会报出警告QSocketNotifier: socket notifiers cannot be enabled from another thread。对这个问题懵懵懂懂。希望大家能探讨一下。
离线yl19823442

只看该作者 1楼 发表于: 2016-01-22
new QTcpSocket;和connect(m_TcpSocket,SIGNAL(readyRead()),this,SLOT(sloat_RecvData()));放在新线程的构造函数中执行呢?

不知道你是用server还是client方式,如果是server,在你QTcpServer的void incomingConnection(int handle);函数里面新建一个线程,将handle参数做为新线程的构造参数,并在新线程为新建的QTcpSocke执行setSocketDescriptor(handle)。

你试一下呢,是否正确还请其他高手指教。
离线蚂蚁power

只看该作者 2楼 发表于: 2016-01-22
回 yl19823442 的帖子
yl19823442:new QTcpSocket;和connect(m_TcpSocket,SIGNAL(readyRead()),this,SLOT(sloat_RecvData()));放在新线程的构造函数中执行呢?
不知道你是用server还是client方式,如果是server,在你QTcpServer的void incomingConnection(int handle);函数里面新建一个线程,将handle参数做为新线 .. (2016-01-22 11:51) 

我这是客户端,服务器端现在还不支持多客户端。所以不能在新建一个线程。
离线dbzhang800

只看该作者 3楼 发表于: 2016-01-22
你在run()中new出的QTcpSocket,那么该socket的write() 你也是在run()中调用吗?如果不是,就是你的问题了。
离线蚂蚁power

只看该作者 4楼 发表于: 2016-01-22
回 dbzhang800 的帖子
dbzhang800:你在run()中new出的QTcpSocket,那么该socket的write() 你也是在run()中调用吗?如果不是,就是你的问题了。 (2016-01-22 13:21) 

run()只负责读取数据,发送数据需要从界面发送信号来调用线程的槽函数。
离线jxgyzhang

只看该作者 5楼 发表于: 2016-01-22
class Myclass  : public QThread
{
  public :
   void SendMsg(const QString &msg)

if(this->_socket)
   this->_socket->wirte(msg);

  private:
   QTcpSocket *_socket;
}
如果你的结构是上面我写的一样的。

在run里new QTcpSocket(),此时的tcpsocket属于新的线程,
如果此时你在外面直接调用SendMsg的话就会出现这个错误,你可以将QTcpSocket封装成一个另外一个类,然后这个类在run里面new出来,这个类的SendMsg使用信号和槽的方式进行操作,不要直接调用成员方法的方式就可以了
离线蚂蚁power

只看该作者 6楼 发表于: 2016-01-22
回 jxgyzhang 的帖子
jxgyzhang:class Myclass  : public QThread
{
  public :
   void SendMsg(const QString &msg)

....... (2016-01-22 15:50) 

现在我的Sendmsg()是线程里面的一个槽函数。也是通过页面的信号触发的。我先按照你说的试一下。
离线蚂蚁power

只看该作者 7楼 发表于: 2016-01-26
回 jxgyzhang 的帖子
jxgyzhang:class Myclass  : public QThread
{
  public :
   void SendMsg(const QString &msg)

....... (2016-01-22 15:50) 

就按这你这方法把代码重构了。问题解决了。
离线fcb5511

只看该作者 8楼 发表于: 2018-10-27
怎么 看不到完整的呢,我也遇到这个问题
在线zhaoxg

只看该作者 9楼 发表于: 2021-12-05
也遇到相同的问题!
感觉 QT 线程这块(QThread)设计的很不理解,很是坑!

派生一QThread 在RUN中new TcpSocket ,连接的TcpSocket 槽函数都在QThread派生类中,
结果:connected 信号工作正常,readyRead 信号不工作!
理解起来很不适应!
快速回复
限100 字节
 
上一个 下一个