• 8649阅读
  • 9回复

[提问]已连接的套接字能用作全局变量在不同线程中使用么? [复制链接]

上一主题 下一主题
离线jxhxfen2008
 

只看楼主 倒序阅读 楼主  发表于: 2013-03-30
接收数据是一个次线程,发送数据是一个次线程



我做的是  套接字设为全局
主线程建立一个连上服务器的套接字后,接下来次线程调用这个这个套接字进行发送 读取。


问题来了,QObject: Cannot create children for a parent that is in a different thread.
[font='Monospace'](Parent is QNativeSocketEngine(0x11d9340), parent's thread is QThread(0xf6eb80), current thread is recedataThread(0x1362e40)


也就是不能跨线程调用套接字。我该怎么办呢?




补充:我现在换另一种,不把套接字作为全局变量,在主线程中创建套接字后,把套接字作为参数传给次线程,可是这样,在次线程的run中需要用到套接字,还是会出现这个跨线程调用变量的问题。怎么弄呢??
//次线程
recedataThread::recedataThread(QTcpSocket *tcpsocket)
{  
    savetcpsocket = tcpsocket;  //保存传递进来的套接字
}



//接收数据:


void recedataThread::run()
{
    usetcpsocket = new QTcpSocket;

    usetcpsocket = savetcpsocket; //套接字赋给


    .......
}


usetcpsocket 还是属于主线程,在这使用,相当于调用,出现同样问题,该如何解决呢??
离线ffii4455

只看该作者 1楼 发表于: 2013-03-30
别把parent指成this了。既然多线程,那就自己用容器管理socket吧
离线jxhxfen2008

只看该作者 2楼 发表于: 2013-03-31
引用第1楼ffii4455于2013-03-30 17:57发表的  :
别把parent指成this了。既然多线程,那就自己用容器管理socket吧

字节用容器管理socket???不明白什么意思?


我现在换另一种,不把套接字作为全局变量,在主线程中创建套接字后,把套接字作为参数传给次线程,可是这样,在此线程的run中需要用到套接字
,还是会出现这个跨线程调用变量的问题。怎么弄呢
离线jxhxfen2008

只看该作者 3楼 发表于: 2013-03-31
请会的帮下忙,实在不知到咋办了
离线jxhxfen2008

只看该作者 4楼 发表于: 2013-03-31
求帮忙啊
离线pxiao_xiao

只看该作者 5楼 发表于: 2013-03-31
为什么要这么做?
在一个线程里能完成的事为什么拆开弄?
可以在一个线程里定义读写
读和写同时只能一个发生行为
外部传入数据 信号-槽就能解决
如果碰到槽函数在主线程执行 就thread.moveToThead(&thread); 虽然Qt不推荐 但不影响执行
离线jxhxfen2008

只看该作者 6楼 发表于: 2013-03-31
引用第5楼pxiao_xiao于2013-03-31 21:35发表的  :
为什么要这么做?
在一个线程里能完成的事为什么拆开弄?
可以在一个线程里定义读写
读和写同时只能一个发生行为
外部传入数据 信号-槽就能解决
.......


开辟线程是防止界面卡。有好多界面需要发送数据和接收数据,所以我就开辟两个线程
离线pxiao_xiao

只看该作者 7楼 发表于: 2013-03-31
你已经放在UI线程之外的线程 还操这个心.......
离线jxhxfen2008

只看该作者 8楼 发表于: 2013-04-01
引用第7楼pxiao_xiao于2013-03-31 22:30发表的  :
你已经放在UI线程之外的线程 还操这个心.......

你说的意思就是不让我开线程呗。如果我非要开,这个问题怎么解决,你的意思就是多线程的话就没法解决么
离线pxiao_xiao

只看该作者 9楼 发表于: 2013-04-01
曾经试着把QFtp在主线程创建然后传递给辅助线程 错误是一样的
后来分析了源码 Qt在实现的时候 然后IO在后台异步 对两个线程无法分清
快速回复
限100 字节
 
上一个 下一个