当前位置: 首页 > news >正文

顺德公益网站制作宝安网站建设seo信科

顺德公益网站制作,宝安网站建设seo信科,wordpress 模拟post,化工建设网站QT 界面编程中使用协程 一、概述二、集成2.1、编译 Acl2.2、将 Acl 库集成到 QT 项目中2.3、开始编写代码2.3.1、QT 程序初始化时初始化 Acl 协程2.3.2、在界面中创建协程2.3.3、界面程序退出前需要停止协程调度2.3.4、在界面线程中下载数据2.3.5、在协程中延迟创建窗口 2.4、效… QT 界面编程中使用协程 一、概述二、集成2.1、编译 Acl2.2、将 Acl 库集成到 QT 项目中2.3、开始编写代码2.3.1、QT 程序初始化时初始化 Acl 协程2.3.2、在界面中创建协程2.3.3、界面程序退出前需要停止协程调度2.3.4、在界面线程中下载数据2.3.5、在协程中延迟创建窗口 2.4、效果展示2.5、小结 一、概述 人们在谈论协程编程时往往与编写命令行网络程序有关如编写网络客户端与网络服务器程序很少涉及到客户端 UI 相关的界面编程。Acl 协程库是支持在 Windows 下的 UI 界面编程的因为 Acl 协程的事件引擎支持了界面消息传递过程。最近学习了一下 QT UI 编程轻松将 Acl 协程与 QT UI 集成在一起从而实现了 QT 界面协程化使开发人员在使用 QT 编写界面程序时编写网络模块变得非常简单。 本文结合 Acl 中 lib_fiber/samples-gui/QtFiber 示例演示了如何将 Acl 协程功能集成到 QT 界面中实现了网络模块与界面模块的融合。 二、集成 2.1、编译 Acl 目前 QT IDE 还无法直接使用 Acl 里的 CMakeLists.txt 文件编译 ACL可以借助于 VC2019 打开 Acl 里的 acl_cpp_vc2019.sln 工程编译 Acl 五个库的动态库分别为lib_acl.dll, lib_protocol.dll, lib_acl_cpp.dll, libfiber.dll, libfiber_cpp.dll 及静态导出库lib_acl.lib, lib_protocol.lib lib_acl_cpp.lib, libfiber.lib, libfiber_cpp.lib。 2.2、将 Acl 库集成到 QT 项目中 参考 lib_fiber/samples-gui/QtFiber/CMakeLists.txt 文件将 Acl 库的头文件包含进去如下 set(acl_path ../../..)include_directories(${acl_path}/lib_acl/include${acl_path}/lib_acl_cpp/include${acl_path}/lib_fiber/c/include${acl_path}/lib_fiber/cpp/include )然后设定编译条件 add_definitions(-DACL_DLL-DACL_CPP_DLL-DHTTP_DLL-DICMP_DLL-DSMTP_DLL-DFIBER_CPP_DLL-D_CRT_SECURE_NO_WARNINGS-D_WINSOCK_DEPRECATED_NO_WARNINGS )添加库到工程中如下 if (CMAKE_BUILD_TYPE STREQUAL RELEASE)set(acl_libs_path ${CMAKE_CURRENT_SOURCE_DIR}/../../../x64/ReleaseDll) else()set(acl_libs_path ${CMAKE_CURRENT_SOURCE_DIR}/../../../x64/DebugDll) endif()set(lib_all ${acl_libs_path}/libfiber_cpp.lib${acl_libs_path}/lib_acl_cpp.lib${acl_libs_path}/lib_protocol.lib${acl_libs_path}/lib_acl.lib${acl_libs_path}/libfiber.lib)target_link_libraries(QtFiber PRIVATE Qt5::Widgets ${lib_all} Ws2_32)add_custom_command(TARGET ${PROJECT_NAME} POST_BUILDCOMMAND ${CMAKE_COMMAND} -E copy_if_different${acl_libs_path}/libfiber_cpp.dll${acl_libs_path}/libfiber.dll${acl_libs_path}/lib_acl_cpp.dll${acl_libs_path}/lib_acl.dll${acl_libs_path}/lib_protocol.dll$TARGET_FILE_DIR:${PROJECT_NAME} )2.3、开始编写代码 经过摸索研究想要集成 Acl 协程到 QT UI 程序中需要采用以下方法主要是协程的初始化及退出 2.3.1、QT 程序初始化时初始化 Acl 协程 在调用 QT APP exec() 前需要先调用 Acl 协程初始化过程如下 static void startupCallback() {acl::fiber::schedule_gui(); // Wont return until schedule finished. }void main() {QApplication app(argc, argv);MainWindow w;w.show();QTimer::singleShot(0, startupCallback);app.exec(); }可以看出在调用 app.exec() 前注入了启动函数 startupCallback()在里面启动了 acl 在界面模式下的协程调度过程 acl::fiber::schedule_gui()该方法将进入界面消息循环过程直到协程调度停止后才会返回。 2.3.2、在界面中创建协程 一旦协程调度器启动就可以创建并运行协程了可以在主界面上添加一个按钮当点击该按钮后的处理函数中便可以创建并启动一个协程。比如在例子中点击 “Start fiber server” 按钮在处理函数 MainWindow::onStartServer() 中可以创建一个网络监听服务器如下 void MainWindow::onStartServer() {...server_ new fiber_server(127.0.0.1, 9001, this);server_-start();... }这样在界面里就创建了一个 TCP 监听协程当有连接连接监听地址时在监听协程里便可以创建一个客户端连接处理协程进行处理如下 while (true) {SOCKET conn socket_accept(sock);if (conn INVALID_SOCKET) {break;}acl::fiber* fb new fiber_echo(conn);fb-start();}上面例子的客户端协程启动后便可以进行网络 IO 读写如下 char buf[8192];while (true) {int ret acl_fiber_recv(conn_, buf, sizeof(buf) - 1, 0);if (ret -1) {break;}buf[ret] 0;if (acl_fiber_send(conn_, buf, ret, 0) ! ret) {break;}}2.3.3、界面程序退出前需要停止协程调度 必须保证在界面程序退出前停止协程调度器否则界面程序无法正常退出该步骤也非常重要。可以在主界面处理类里重载基类的 void closeEvent(QCloseEvent *event); 方法在该方法里停止协程调度器如下 void MainWindow::closeEvent(QCloseEvent *event) {acl::fiber::schedule_stop(); // 停止协程调度器event-accept(); // 接受关闭事件 }2.3.4、在界面线程中下载数据 点击主界面中点击HTTP下载按钮在事件处理函数中创建协程从后端HTTP服务器下载数据过程如下 void MainWindow::onUrlGet() {...go[this] {const char *url http://www.baidu.com/;acl::http_request req(url);if (!req.request(nullptr, 0)) {printf(Send HTTP request failed\r\n);return;}acl::string body;if (!req.get_body(body)) {printf(Get HTTP body error\r\n);return;}qDebug() Got body: body.c_str();...}; }2.3.5、在协程中延迟创建窗口 如果想某个窗口延迟创建不必借助定时器直接在协程中就可以轻松实现 void MainWindow::delayCreate() {go[this] {acl::fiber::delay(5000); // 休眠 5 秒InputDialog dialog(this);dialog.exec();};qDebug() Fiber was created to create one window after a while; }2.4、效果展示 编译运行 acl/lib_fiber/samples-gui/QtFiber/ 工程可以得到以下运行界面 在前面窗口中右边请求HTTP服务器时的HTTP请求头右连接为后端服务器返回的HTTP响应头该下载过程中在协程中进行运行结果显示在主界面上 窗口下方的进度条为客户端协程与服务端协程交互时的交互进度展示。 2.5、小结 以上便是如何编译集成 Acl 协程到 QT 界面程序的方法主要的要点是 需要使用 vc2019 编译 Acl 的动态库并集成至 QT 界面程序的工程文件中编程时需要注意 在启动 QT 即调用 app.exec()前需要先启动 Acl 协程调度器在主界面类里需要重载基类关闭虚方法 closeEvent()并在该方法里停止 Acl 协程调度器因为协程运行在界面的线程空间中所以可以在协程中直接操作界面上的窗口对象避免了线程之间的消息传递过程。 注 Acl库下载https://github.com/acl-dev/acl/
http://www.w-s-a.com/news/715893/

相关文章:

  • 有个蓝色章鱼做标志的网站高端的网站建设怎么做
  • 建站网址导航hao123html网页设计实验总结
  • 西宁市网站建设价格丽水集团网站建设
  • 长宁怎么做网站优化好本机怎么放自己做的网站
  • 诚信网站备案中心网站字体怎么设置
  • 企业网站建设费是无形资产吗佛山网站建设哪个好点
  • 网站建设就业方向国开行网站毕业申请怎么做
  • 创建一个网站的费用wordpress 4.0 安装
  • 会员登录系统网站建设dw软件是做什么用的
  • 手机网站被做跳转长沙网上购物超市
  • 网站建设中网站需求分析设计网站推荐html代码
  • 容易收录的网站台州汇客网站建设
  • 企业网站源码百度网盘下载网站备案号如何查询密码
  • 个人网站建设课程宣传栏制作效果图
  • 自己做的网站能上传吗网上做彩票网站排名
  • 教育培训网站模板下载自己做商务网站有什么利弊
  • 平面设计公司网站兰州室内设计公司排名
  • 个人工作室注册条件温州seo结算
  • 360免费建站系统中国建设银行官网站黄金部王毅
  • 罗源福州网站建设个体户可以网站备案吗
  • 网站开发 专有名词pc网站建设和推广
  • 上海部道网站 建设conoha wordpress
  • 手机测评做视频网站宝塔可以做二级域名网站么
  • 代理公司注册济南重庆seo优化效果好
  • 佛山市骏域网站建设专家徐州网站建设价格
  • 公司做网站多济南好的网站建设公司排名
  • 网站维护的方式有哪几种该网站在工信部的icp ip地址
  • 中小企业服务中心网站建设做考勤的网站
  • 大连网站建设报价wordpress实用功能
  • 学校网站建设自查报告电脑网站制作教程