• 17470阅读
  • 6回复

QObject: Cannot create children for a parent that is in a different thread? [复制链接]

上一主题 下一主题
离线renr1981
 
只看楼主 倒序阅读 楼主  发表于: 2009-09-21
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
写了一个类
class TcpClient:QObject,
{}
实现QTcpSocket和服务器的链接和发送接收数据操作;
另一个类
class BackThread:QThread
{}
BackThread的run()函数中,调用TcpClient类对象
在其他类中建立BackThread对象,并start(),但是运行程序的时候提示题目所示的错误:
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QTcpSocket(0x8682788), parent's thread is QThread(0x86048c0), current thread is BackThread(0x869d6b0)
不知道这是怎么回事?看意思好像是父对象出了问题,我都用的0啊,
另外,当直接在其他类中调用TcpClient对象的函数时,可以实现与服务器的交互,
请高手指教问题所在。
离线shiroki

只看该作者 1楼 发表于: 2009-09-21
代码多贴一点看看
--
shiro is White
ki is tree
http://www.cuteqt.com
论坛 http://www.cuteqt.com/bbs
博客 http://www.cuteqt.com/blog
博客镜像: http://sites.cuteqt.com/cuteqt
Linux/Qt/嵌入式讨论群 http://qun.qq.com/air/5699823
离线renr1981
只看该作者 2楼 发表于: 2009-09-22
TcpClient::TcpClient(int infoType)//,QObject* parent)//:QObject(parent)
{
    typeInfo=infoType;
    q=new QSqlQuery();
    q->exec("select serverip,serverport from salesiteinfo");
    if(q->next())
    {
        srvIP=q->value(0).toString();
        srvPort=q->value(1).toInt();
    }
    q->clear();
    tcpClient=new QTcpSocket();
    timer.setInterval(reConInterval);
    timer.start();
    connect(&timer,SIGNAL(timeout()),this,SLOT(connSrv()));
    QObject::connect(tcpClient,SIGNAL(connected()),this,SLOT(sendMsg()));
    connect(tcpClient, SIGNAL(error(QAbstractSocket::SocketError)),      this, SLOT(operateError(QAbstractSocket::SocketError)));
    //connect(tcpClient,SIGNAL(disconnected()),&timer,SLOT(stop()));    
    connect(tcpClient,SIGNAL(readyRead()),this,SLOT(recvMsg()));
}

void TcpClient::connSrv()
{
    tcpClient->connectToHost(srvIP, srvPort);
    //tcpClient->connectToHost(QHostAddress::LocalHost,16689);//测试
    timer.stop();
}

void TcpClient::sendMsg()
{
    QTextStream sendOut(tcpClient);
    if(typeInfo==SEND_DATE)
    {
        sendOut<<"0001||date checked cmd";
        return;
    }
    ......
}



BackThread::BackThread(int socketType)
{
    type=socketType;
    tcpClient=new TcpClient(type);
}

void BackThread::run()
{
    QMutexLocker locker(&mutex);
    tcpClient->connSrv();
}


CFindFileForm::CFindFileForm(QWidget* parent):QWidget(parent)
{
    setupUi(this);
    setAttribute(Qt::WA_DeleteOnClose);
    bt=new BackThread(SEND_DATE);
    bt->start();
    //tc=new TcpClient(SEND_DATE);
}
离线renr1981
只看该作者 3楼 发表于: 2009-09-22
很多地方说用信号槽实现,但是不知道该怎么弄,请高手指教啊
离线gylmy
只看该作者 4楼 发表于: 2010-12-15
楼主我现在也遇到这个问题了,请问楼主解决了吗?
离线oscarboycn

只看该作者 5楼 发表于: 2011-02-23
BackThread::BackThread(int socketType)
{
    type=socketType;
    tcpClient=new TcpClient(type);
}
-==========================================
tcpClient在主线程的BackThread::BackThread生成,

void BackThread::run()
{
    QMutexLocker locker(&mutex);
    tcpClient->connSrv();
}
==================================
子线程BackThread::run中调用了tcpClient

TCPSocket的生成,操作必须在一个线程完成

http://www.21ic.com
http://bbs.eetop.cn
http://www.eetop.cn/
http://www.eet-china.com/
http://www.netyi.net/
http://www.pcbbbs.com/
http://www.pcbtech.net/
离线chaijunkun
只看该作者 6楼 发表于: 2011-04-23
线程类中的信号一旦连接到外部的槽,信号被触发后就会在debug监视信息中出现这个信息的。正确的做法是将信号改成事件机制。如果有必要,应该自定义事件,继承QEvent类,注意需要定义消息类型,且不能与现有消息类型冲突。然后再自己扩展的事件中加入需要的参数。发送消息的地方改为qApp.postEvent(接收方,消息指针)。在接收方还应写一个事件处理函数。参数为自定义的消息类型。或者在接收方重写customEvents方法,在方法内判断是否为自定义事件,然后进行处理。多线程之间的通讯是比较麻烦的
快速回复
限100 字节
 
上一个 下一个