当前位置:编程学习 > wap >>

如何实现在一个线程内新建QTcpSocket且实现定时判定socket是否连接成功

已实践的是在工程中新建一个network类,继承于QThread,network内有一个QTcpSocket指针,network中startTimer一个timer,重载timeEvent.
问题是,如果在run中new QTcpSocket,则timeEvent中定时判断QTcpSocket是否连接会跨线程访问;而如果在network中new,这run访问QTcpSocket会跨线程访问.
不知道我理解是否有误,且该如何实现. --------------------编程问答-------------------- 猜想一:如果在run中new QTcpSocket,可以再在run内new一个QTimer,不过槽函数在哪里定义呢,如果在network中定义,那槽函数是在主线程中吗,如果是的话那槽函数访问QTcpSocket会跨线程?可以让槽函数在子线程中吗? --------------------编程问答-------------------- 可以在外面new, 然后通过 moveToThread方法 将对象移到线程里面, 也可以用你的猜想一,对象在run里面new的,他的槽函数是在该线程执行。 --------------------编程问答--------------------
引用 2 楼  的回复:
可以在外面new, 然后通过 moveToThread方法 将对象移到线程里面, 也可以用你的猜想一,对象在run里面new的,他的槽函数是在该线程执行。

猜想一不行,槽函数访问QTcpSocket会跨线程,槽函数应该是在主线程中执行,已qDeubg<<thread()验证.
你说的moveto,如果moveto了,也会出现跨线程情况?因为一个run访问QTcpSocket,一个槽函数访问,两者所在线程应该不一样.
我觉得我一直陷在跨线程,定时器里面了,有没有什么方法也是可以实现定时访问socket是否连接成功的呢? --------------------编程问答-------------------- 你说的槽函数是定时器的槽函数把,定时器不能在run里面new,即使在run里new也不是跨线程的。Qt推荐的使用方法是将对象moveto到线程里面。除了几个特殊的类之外,其他的在run里new,并在run里connect,他的槽函数会再线程里执行,具体的你可以百度下。 --------------------编程问答--------------------
引用 2 楼  的回复:
可以在外面new, 然后通过 moveToThread方法 将对象移到线程里面, 也可以用你的猜想一,对象在run里面new的,他的槽函数是在该线程执行。

发现一个很严重的问题,刚刚QTcpSocket不是在run中new,改成在run中new之后timer不定时发timeout了,怎么回事 --------------------编程问答--------------------
引用 5 楼  的回复:
引用 2 楼 的回复:

可以在外面new, 然后通过 moveToThread方法 将对象移到线程里面, 也可以用你的猜想一,对象在run里面new的,他的槽函数是在该线程执行。

发现一个很严重的问题,刚刚QTcpSocket不是在run中new,改成在run中new之后timer不定时发timeout了,怎么回事

connect了吗。对象在run里new,并在run里connect,他的槽函数就会在线程里面执行。 --------------------编程问答--------------------
引用 2 楼  的回复:
可以在外面new, 然后通过 moveToThread方法 将对象移到线程里面, 也可以用你的猜想一,对象在run里面new的,他的槽函数是在该线程执行。

发现原因了,没有执行exec,qdebug<<thread()发现槽函数确实是在子线程中执行,不过槽函数中访问QTcpSocket还是出现QObject: Cannot create children for a parent that is in a different thread.错误. --------------------编程问答-------------------- 把定时器那段屏了看还有提示么。要再run里创建才行, 在构造创建肯定会出现这样提示的。 --------------------编程问答--------------------
引用 8 楼  的回复:
把定时器那段屏了看还有提示么。要再run里创建才行, 在构造创建肯定会出现这样提示的。

是的,我是在run里new的timer,屏了之后由于没有调用槽函数就没报错.
情况是这样的:run是new QTcpSocket,然后new QTimer,然后一个死循环接收数据,槽函数里面判断QTcpSocket是否连接成功.
一开始运行run,qDebug<<thread()显示run是子线程中,然后执行到new QTimer后马上报一个跨线程,然后去了循环,timeout了去槽,槽内qDebug<<thread()也显示是在子线程中,槽中调用了QTcpSocket的connectToHost和waitForConnected都分别报一个跨线程. --------------------编程问答-------------------- 线程死循环?  没有调用 exec();那样根本没进入事件循环,你怎么进入槽函数? --------------------编程问答--------------------
引用 10 楼  的回复:
线程死循环?  没有调用 exec();那样根本没进入事件循环,你怎么进入槽函数?

有调exec,只是不是重点没说而已,先调的exec,再进的死循环,进了槽函数的. --------------------编程问答-------------------- QTcpSocket会跨线程访问有问题吗? --------------------编程问答-------------------- 同样问题,顶一下。 --------------------编程问答-------------------- 哪位的工作是用到QT开发的???哪位专业人士啊??

可联系我,广州指点传媒集团 HR.  邮箱:syting@y6.cn 
--------------------编程问答-------------------- 迫不得已只能这样找人了。各位见怪莫怪啊~~哈哈~~
补充:移动开发 ,  Qt
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,