您的位置:首页 > 编程语言 > Qt开发

学习QT线程时所遇到的问题。

2013-05-17 09:24 239 查看
一、线程run函数内如果使用了while(1)循环的话,其线程内部的connect()函数无法生效,即信号来了,槽函数也不会得到调用。

原因:while(1)后,无法exec()函数,导致connect()函数没有生效。

解决方法1:可以在while(1)函数最后调用 qApp->processEvents();

解决方法2:不使用while(1)函数来循环,而是通过信号与槽来进行,即通过判断某条件是否成立,如果成立,就发送信号,再调用槽函数,从而达到循环的效果。

二、使用之前老方法,通过继承QThread类来创建线程,导致新建类中的函数并没有在该线程中执行,而是在主gui线程中执行。

原因:

因为在创建新类的时候,其是在主线中创建的,此时并没有运行run()函数,所以其后面运行的函数都是在主线程中运行的。

解决办法1:

后来通过在connect()函数的最后增加了Qt::DirectConnection后可以实现。

前提是:connect()函数的第一个参数的作用域是次线程的。

例如,需要在次线程中使用TCPSOCKET ,则可以在run()函数中新建 tcpsocket对象。

此时需要明白connect()函数的第五个参数的不同值的作用:

a) DirectConnection,信号发送后槽函数立即执行,由sender的所在线程执行;

b) QueuedConnection,信号发送后返回,相关槽函数由receiver所在的线程在返回到事件循环后执行;

c) 默认使用的是Qt::AutoConnection,当sender和receiver在同一个线程内时,采用DirectConnection的方式,当sender和receiver在不同的线程时,采用QueuedConnection的方式。

解决办法2:(该方法可以避免重载run()函数时,所带来的操作的不便。建议使用该方法。)

通过以下方法来实现:

/*创建tcpsocket网络套接字,用来与服务器之间数据的交换*/

tcpSocket_Object *Tcpsocket = new tcpSocket_Object();

/*此部分槽函数在下面新创建的线程内执行.*/

connect(Tcpsocket->tcpClient,SIGNAL(connected()),Tcpsocket,SLOT(sendHeartPackData()),Qt::QueuedConnection);

connect(Tcpsocket,SIGNAL(sendHeartPackSignal ()),Tcpsocket,SLOT(sendHeartPackData()),Qt::QueuedConnection);

/*新建一个线程*/

thread = new QThread;

Tcpsocket->moveToThread(thread); // 该语句是将tcpsocket中的槽函数放入线程中执行,但必须配合前面的connect一起才生效.如果其第五位参数为默认或者是Qt::DirectConnection,则槽函数的作用域在主线程中。

thread->start();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: