qt
vs
创建一个tcp处理的基类,该类有两个纯虚函数当tcp连接状态发生变化时会调用连接函数当收到tcp数据时会调用接收消息函数
在tcp连接类中,构造函数传入了tcp处理的基类的指针提供了初始化函数、连接函数还有相应的槽函数。这里只是示例,所以不没有接收和发送tcp消息的接口
从tcp处理的基类继承,并实现相应的虚函数。这里做测试用,所以没有实际的操作,只打印线程号
在main函数中,初始化ip和端口,启动连接,可以看到已经成功调用到子类tcp连接函数
修改CMyTcpSocketDeal类,从基类QRunnable继承,并实现run函数因为要在run线程中连接tcp服务,所有定义了tcp连接类的属性
设置自动删除属性,并在析构函数中增加打印信息
在run函数中连接tcp服务。运行后查看日志,并没有调到tcp连接函数。这是因为run函数退出,就认为线程结束如何不让run函数退出,等待tcp连接的调用呢?可能想到有Sleep函数或QWaitCondition,但是他们都会阻塞当前线程,当前线程并不能处理tcp连接的信号及槽函数
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.)
需要增加头文件和testlib库,在run函数增加QTest::qWait(5 * 1000);
查看运行效果,可以正常调用tcp连接函数
但是QTest比较只是作为测试用的,有没有别的方法呢?QTest是通过QElapsedTimer和QCoreApplication实现的,我们使用它们来实现相应的功能在打印信息中增加事件戳
运行结果可以看到,功能可以正常实现,但是等待时间比较长,能不能在收到连接就直接退出while循环呢?
我们通过增加一个判断参数来实现,在调用到连接函数后,修改变量值
查看运行结果,完美实现所需功能