• 9525阅读
  • 2回复

请教QThread与QTcpSocket的问题!!!! [复制链接]

上一主题 下一主题
离线reback
 
只看楼主 倒序阅读 楼主  发表于: 2010-03-24
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
请教线程与socket的问题!!!!
我在线程里用QTcpSocket连服务器
void CRealDataThread::run()
{
    QTcpSocket hTcpSocket;
    connect(&hTcpSocket, SIGNAL(readyRead()), this, SLOT(OnReadyRead()));
                      ......
                      exec();
}
然后在onreadyread信号里处理数据
void CRealDataThread::OnReadyRead()
{
    QTcpSocket* pSocket = qobject_cast<QTcpSocket*>(sender());
    Q_ASSERT(pSocket != NULL);
......
pSocket->write((const char*)&commHead, sizeof(commHead));
结果就说:
QSocketNotifier: socket notifiers cannot be enabled from another thread
谁知道为什么?
接收没事,发送就说跨线程?
如果改成:
    connect(&hTcpSocket, SIGNAL(readyRead()), this, SLOT(OnReadyRead()), Qt::DirectConnection);
那么
    QTcpSocket* pSocket = qobject_cast<QTcpSocket*>(sender());
    Q_ASSERT(pSocket != NULL);
这个断言就会报错!
奇怪啊,在run里面实例化的变量,应该就在子线程空间吧?OnReadyRead()也应该是子线程调用的?

如果改成:
void CRealDataThread::run()
{
      m_pTcpSocket = new QTcpSocket();
      connect(m_pTcpSocket, SIGNAL(readyRead()), this, SLOT(OnReadyRead()), Qt::DirectConnection);
....
void CRealDataThread::OnReadyRead()
{
    QTcpSocket* pSocket = m_pTcpSocket;//qobject_cast<QTcpSocket*>(sender());

这样就不会有错。。。奇怪呢

我看到QT好几个例子都是在run函数阻塞的方式调用QTcpSocket,难道在线程里就没有办法用QTcpSocket的消息循环?
[ 此帖被reback在2010-03-24 11:27重新编辑 ]
离线yb824
只看该作者 1楼 发表于: 2010-03-24
有个办法 sender 和receiver 都在run 里创建
离线hello0608
只看该作者 2楼 发表于: 2010-04-02
QThread类中的数据成员和函数都是在QThread申明的线程(主线程)中执行的,void CRealDataThread::OnReadyRead()这个函数
当然在主线程空间里执行了,就跨线程了.
new QTcpSocket()之后,虽然m_pTcpSocket 是属于主线程的,但是它指向的QTcpSocket实例是在子线程中,OnReadyRead())会在子线程中执行,就不会出错了
快速回复
限100 字节
 
上一个 下一个