首页| 论坛| 消息

标题:在QThread线程中使用QTcpSocket的问题
作者:蚂蚁power
日期:2016-01-22 11:37
内容:

功能是这样的:在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。对这个问题懵懵懂懂。希望大家能探讨一下。


#1 [yl19823442 01-22 11:51]
new QTcpSocket;和connect(m_TcpSocket,SIGNAL(readyRead()),this,SLOT(sloat_RecvData()));放在新线程的构造函数中执行呢?
不知道你是用server还是client方式,如果是server,在你QTcpServer的void incomingConnection(int handle);函数里面新建一个线程,将handle参数做为新线程的构造参数,并在新线程为新建的QTcpSocke执行setSocketDescriptor(handle)。
你试一下呢,是否正确还请其他高手指教。
#2 回 yl19823442 的帖子 [蚂蚁power 01-22 12:30]
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) 
我这是客户端,服务器端现在还不支持多客户端。所以不能在新建一个线程。
#3 [dbzhang800 01-22 13:21]
你在run()中new出的QTcpSocket,那么该socket的write() 你也是在run()中调用吗?如果不是,就是你的问题了。
#4 回 dbzhang800 的帖子 [蚂蚁power 01-22 13:59]
dbzhang800:你在run()中new出的QTcpSocket,那么该socket的write() 你也是在run()中调用吗?如果不是,就是你的问题了。 (2016-01-22 13:21) 
run()只负责读取数据,发送数据需要从界面发送信号来调用线程的槽函数。
#5 [jxgyzhang 01-22 15:50]
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使用信号和槽的方式进行操作,不要直接调用成员方法的方式就可以了

<< 1 2 >> (1/2)

回复 发表
主题 版块