多语言展示
当前在线:1893今日阅读:176今日分享:34

QRunnable中,如何接收tcp连接信息

本文通过一个tcp连接的实例,讲解如何在qt线程池中启动事件循环等待事件触发
工具/原料
1

qt

2

vs

qt tcp连接类
1

创建一个tcp处理的基类,该类有两个纯虚函数当tcp连接状态发生变化时会调用连接函数当收到tcp数据时会调用接收消息函数

2

在tcp连接类中,构造函数传入了tcp处理的基类的指针提供了初始化函数、连接函数还有相应的槽函数。这里只是示例,所以不没有接收和发送tcp消息的接口

测试tcp连接类
1

从tcp处理的基类继承,并实现相应的虚函数。这里做测试用,所以没有实际的操作,只打印线程号

2

在main函数中,初始化ip和端口,启动连接,可以看到已经成功调用到子类tcp连接函数

创建QRunnable子类
1

修改CMyTcpSocketDeal类,从基类QRunnable继承,并实现run函数因为要在run线程中连接tcp服务,所有定义了tcp连接类的属性

2

设置自动删除属性,并在析构函数中增加打印信息

3

在run函数中连接tcp服务。运行后查看日志,并没有调到tcp连接函数。这是因为run函数退出,就认为线程结束如何不让run函数退出,等待tcp连接的调用呢?可能想到有Sleep函数或QWaitCondition,但是他们都会阻塞当前线程,当前线程并不能处理tcp连接的信号及槽函数

使用QTest::qWait函数
1

QTest::qWait 将等待一段事件,在等待时,可以进行事件处理(Waits for ms milliseconds. While waiting, events will be processed and your test will stay responsive to user interface events or network communication.)

2

需要增加头文件和testlib库,在run函数增加QTest::qWait(5 * 1000);

3

查看运行效果,可以正常调用tcp连接函数

QElapsedTimer和QCoreApplication
1

但是QTest比较只是作为测试用的,有没有别的方法呢?QTest是通过QElapsedTimer和QCoreApplication实现的,我们使用它们来实现相应的功能在打印信息中增加事件戳

2

运行结果可以看到,功能可以正常实现,但是等待时间比较长,能不能在收到连接就直接退出while循环呢?

3

我们通过增加一个判断参数来实现,在调用到连接函数后,修改变量值

4

查看运行结果,完美实现所需功能

推荐信息