• 6116阅读
  • 5回复

QTcpServer下多线程出错。 [复制链接]

上一主题 下一主题
离线radium_sql
 

只看楼主 倒序阅读 楼主  发表于: 2008-10-29
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
我做了一个服务端,当收到一条连接请求时,就开一个线程专门为这个连接响应。但在线程中得到的QTcpSocket却不会发出readyRead()信号,自然也就进行不了读写了。

但如果是用单线程的话,就没有这样的问题,哪位大侠有这样的经验的? 教一下吧。

代码

void OrderSocket::incomingConnection(int handle)
{
//当只用1的代码就一切正常
//111111111111111111111111111111111111
TcpSocket * tmpSocket = new TcpSocket(handle,this);
connect(tmpSocket, SIGNAL(receivedMsg(QString)), this, SLOT(readMsg(QString)));
//111111111111111111111111111111111111

//当只用2的代码时就不能发出readyRead()信号
//222222222222222222222222222222222222222
//当有新的连接到来的时候,新开一个线程进行处理
MultiReceived * mr = new MultiReceived(handle, 0);
connect(mr, SIGNAL(receivedMsgFromThread(QString)), this, SLOT(readMsg(QString)));
connect(mr, SIGNAL(finished()), mr, SLOT(deleteLater()));
mr->start();
//2222222222222222222222222222222222222222
}

TcpSocket  里面是这样写的,cld是incomingConnection里面得到的
{
bool d = setSocketDescriptor(cId);   
//当有信息可读时,则调用readMsg槽进行信息的读取
connect(this, SIGNAL(readyRead()), this, SLOT(readMsg()));
//当连接被断开时,则调用deleteLater()槽进行socket对象的删除
connect(this, SIGNAL(disconnected()), this, SLOT(deleteLater()));   
}
QT什么时候替代MFC?
离线radium_sql

只看该作者 1楼 发表于: 2008-10-29
自己先顶三下。
QT什么时候替代MFC?
离线radium_sql

只看该作者 2楼 发表于: 2008-10-29
第二下
QT什么时候替代MFC?
离线radium_sql

只看该作者 3楼 发表于: 2008-10-29
第三下。
QT什么时候替代MFC?
离线radium_sql

只看该作者 4楼 发表于: 2008-10-29
第四下,再来顶一下,不过问题解决了。在多线程里面要加入事件循环。。exec();
QT什么时候替代MFC?
离线simonetta
只看该作者 5楼 发表于: 2008-11-23
由于具体代码不全, 所以不能完全确定原因, 但是不外乎以下的两种情况:

1. 线程的run 中没有执行exec(), 线程也就没有自己的事件队列处理,也就形成不了signal-slot处理。

2. 动态生成的tcpsocket和处理函数不在一个线程空间中,导致无法形成有效的signal-slot处理。可以注意一下调用connect的最后一个参数Qt::DirectConnection 或者 Qt::QueuedConnection等。

看情况可能第一情况的概率比较大。
我的blog
http://blog.csdn.net/solotek97/
快速回复
限100 字节
 
上一个 下一个