栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

libhv教程17--Qt中使用libhv

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

libhv教程17--Qt中使用libhv

不少c++同学是使用Qt开发GUI界面程序的,而现在的程序里使用网络通信又是不可或缺的一环,使用libhv进行网络编程将是一个很好的选择,所以本章教程将展示如何在Qt中使用libhv。

文章目录
    • 安装Qt
    • 安装cmake
    • 编译libhv
    • 编译examples/qt工程
    • 运行server/client
    • 代码注解

安装Qt

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

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线程间正确的交互方式如下:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/315934.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号