不少c++同学是使用Qt开发GUI界面程序的,而现在的程序里使用网络通信又是不可或缺的一环,使用libhv进行网络编程将是一个很好的选择,所以本章教程将展示如何在Qt中使用libhv。
文章目录- 安装Qt
- 安装cmake
- 编译libhv
- 编译examples/qt工程
- 运行server/client
- 代码注解
Qt官网地址:https://www.qt.io/
Qt下载地址:https://download.qt.io/archive/qt/
以下载Qt 5.14.2为例:
下载地址:https://download.qt.io/archive/qt/5.14/5.14.2/
windows用户点击图中链接即可下载,下载完成后点击exe进行安装。
按照提示一步步安装即可,注意勾选上所需的组件,如下面我们准备使用mingw工具链,则需勾选上MinGW。
最后把编译工具链所在目录加到环境变量PATH里,以上面的mingw为例,就是qmake和mingw32-make所在目录C:QtQt5.14.25.14.2mingw73_64bin和C:QtQt5.14.2Toolsmingw730_64bin
至此Qt就安装好了,可以打开Qt Creator创建一个Qt工程试试吧。
cmake官网下载地址:https://cmake.org/download/
选择最新的Release版本下载安装即可,下载不下来的可以到我的gitee上下载,直接解压缩就行,同理别忘了将cmake的bin目录加到环境变量PATH里。
编译libhv下面演示使用上述Qt安装时的mingw工具链来编译libhv。
git clone https://github.com/ithewei/libhv cd libhv cmake . -G "MinGW Makefiles" -DCMAKE_MAKE_PROGRAM=mingw32-make -Bbuild/mingw64 cmake --build build/mingw64
这样在build/mingw64目录下即生成了头文件include/hv、动态库bin/libhv.dll、动态导入库lib/libhv.dll.a、静态库lib/libhv_static.a
当然不熟悉cmake命令行的同学也可以使用cmake-gui进行配置,configure时选择合适的工具链。
编译examples/qt工程工程位于libhv根目录的examples/qt,使用Qt Creator打开客户端工程client/client.pro和服务端工程server/server.pro,选择mingw工具链,生成即可。
如报libhv相关的头文件找不到或者链库错误,请检查.pro工程文件里的头文件路径和库路径是否配置正确。
INCLUDEPATH += ../../../build/mingw64/include LIBS += -L../../../build/mingw64/lib -lhv
正确生成后就产生了client.exe和server.exe
将hv库libhv.dll、Qt库Qt5Core.dll、Qt5Gui.dll、Qt5Widgets.dll、platforms/qwindows.dll、mingw库libgcc_s_seh-1.dll、libstdc++-6.dll、libwinpthread-1.dll,拷贝到一起,即可点击运行了。
不行的同学可以加QQ群739352073,下载群文件里的libhv-gui.zip。
也可直接使用命令行编译部署
cd examples/qt/client qmake mingw32-make windeployqt.exe release
cd examples/qt/server qmake mingw32-make windeployqt.exe release运行server/client
运行效果图:
上面两个示例程序可以用来测试TCP|UDP|HTTP|WebSocket客户端、服务端通信。
关于Qt的UI界面构建代码和libhv的使用代码,这里就不详细讲了。
主要说下Qt的GUI线程和libhv的网络IO线程之间交互需要注意的事项:
1、不能在非GUI线程直接操作界面;
2、不能在libhv的事件循环线程外调用非标注为线程安全的方法;
注:libhv的write、close是线程安全的,内部已经做了线程保护,允许在其他线程调用,这也是libhv比其它网络库更便利的一点;
关于GUI线程与IO线程本质其实都是事件循环,只不过GUI线程循环处理的是鼠标、键盘等事件,而IO线程循环处理的是网络读写事件,详细介绍见 libhv教程05–事件循环
Qt的GUI线程与libhv的IO线程间正确的交互方式如下:



