libvncclient编写多线程qt的VNC客户端
概述
- 使用qt和libvncclient编写vnc的客户端程序,多线程读写,拒绝卡顿。
- qt环境:5.15.3
- libvncclient:0.9.14
- 下载地址:https://github.com/LibVNC/libvncserver/releases
编译libvncclient
- 打开CMakeList文件,找到编译开关,注释掉不需要的编译项目:
# all the build configuration switches
option(LIBVNCSERVER_INSTALL "Generate installation target" ON)
option(BUILD_SHARED_LIBS "Build shared libraries" ${UNIX})
option(WITH_ZLIB "Search for the zlib compression library to support additional encodings" ON)
option(WITH_LZO "Search for the LZO compression library to omit internal miniLZO implementation" ON)
option(WITH_JPEG "Search for the libjpeg compression library to support additional encodings" ON)
option(WITH_PNG "Search for the PNG compression library to support additional encodings" ON)
option(WITH_SDL "Search for the Simple Direct Media Layer library to build an example SDL vnc client" ON)
option(WITH_GTK "Search for the GTK library to build an example GTK vnc client" ON)
option(WITH_LIBSSHTUNNEL "Search for libsshtunnel to build an example ssh-tunneled client" ON)
option(WITH_THREADS "Search for a threading library to build with multithreading support" ON)
option(PREFER_WIN32THREADS "When searching for a threading library, prefer win32 threads if they are found" ON)
option(WITH_GNUTLS "Search for the GnuTLS secure communications library to support TLS" OFF)
option(WITH_OPENSSL "Search for the OpenSSL cryptography library to support TLS and use as crypto backend" ON)
option(WITH_SYSTEMD "Search for libsystemd to build with systemd socket activation support" ON)
option(WITH_GCRYPT "Search for Libgcrypt to use as crypto backend" ON)
option(WITH_FFMPEG "Search for FFMPEG to build an example VNC to MPEG encoder" ON)
option(WITH_TIGHTVNC_FILETRANSFER "Enable filetransfer if there is pthreads support" ON)
option(WITH_24BPP "Allow 24 bpp" ON)
option(WITH_IPv6 "Enable IPv6 Support" ON)
option(WITH_WEBSOCKETS "Build with websockets support" ON)
option(WITH_SASL "Build with SASL support" ON)
option(WITH_XCB "Build with XCB support" ON)
option(WITH_EXAMPLES "Build examples" OFF)
option(WITH_TESTS "Build tests" OFF)
option(WITH_QT "Build the Qt client example" OFF)
- 也可以自己手动去掉不需要的库依赖,我这里没有把server的库依赖去干净。
- 然后取出项目中的libvncclient.so和头文件中的client目录到自己的项目中。
- 将build目录中的include中的rfbconfig.h拷贝到头文件目录
项目思路
- 主要思路如下:
- 创建一个主窗口QWidget用于画面渲染,创建一个接收线程和一个发送线程。
- 接收线程负责读取vnc服务器发送的数据并解码装换成QImage,通过信号发送QImage,通知主线程刷新页面。
- 发送线程用于发送主窗口的鼠标移动,点击等事件,用于实时更新操作。
项目编写
- VncWideget : 主要的渲染窗口
#ifndef VNCVIEWWIDGET_H
#define VNCVIEWWIDGET_H#include <QWidget>
#include <QThread>#include "rfb/rfbclient.h"
#include "rfb/rfbconfig.h"#include "vnc_client/vncrecvthread.h"
#include "vnc_client/vncsendworker.h"class VncViewWidget : public QWidget
{Q_OBJECT
public:explicit VncViewWidget(QString ip, quint32 port, QWidget *parent = nullptr);~VncViewWidget();void start();void stop();inline bool isStarted(){return _startFlag;}void updateImage(const QImage& image);void paintEvent(QPaintEvent *event) override;void mouseMoveEvent(QMouseEvent* event) override;void mousePressEvent(QMouseEvent *event) override;void mouseReleaseEvent(QMouseEvent *event) override;void closeEvent(QCloseEvent* event) override;private:QImage _image;rfbClient *_cl;QString _ip;quint32 _port;bool _startFlag = false;QThread* _vncSendThread;VNCSendWorker* _vncSendWorker;VNCRecvThread* _vncRecvThread;signals:void sendMouseState(rfbClient* cl, int x, int y, int button);void fullWindowCloseSignal();public slots:
};#endif // VNCVIEWWIDGET_H
- VNCSendWorker:数据发送工作线程
#ifndef VNCSENDWORKER_H
#define VNCSENDWORKER_H#include <QObject>#include "rfb/rfbclient.h"class VNCSendWorker : public QObject
{Q_OBJECT
public:explicit VNCSendWorker( QObject *parent = nullptr);signals:public slots:void sendMouseUpdateMsg(rfbClient* cl, int x, int y, int button);};#endif // VNCSENDWORKER_H
VNCRecvThread :接收线程
#ifndef VNCRECVTHREAD_H
#define VNCRECVTHREAD_H#include <QThread>#include <QImage>#include "rfb/rfbclient.h"class VNCRecvThread : public QThread
{Q_OBJECT
public:VNCRecvThread(QObject* parent = nullptr);inline void startRun(rfbClient* cl){if(_runFlag)return;_cl = cl;_cl->FinishedFrameBufferUpdate = frameBufferUpdated;rfbClientSetClientData(_cl, nullptr, this);_runFlag = true;this->start();}inline void stopRun(){if(!_runFlag)return;_runFlag = false;if(_cl)rfbClientSetClientData(_cl, nullptr, nullptr);if(_cl)_cl->FinishedFrameBufferUpdate = nullptr;_cl = nullptr;}static void frameBufferUpdated(rfbClient* cl);protected:void run() override;private:bool _runFlag = false;rfbClient* _cl;signals:void updateImageSignal(QImage);
};#endif // VNCRECVTHREAD_H
项目完整代码
gitee:https://gitee.com/li-gouhi2333/vncclient/tree/master/
相关文章:
libvncclient编写多线程qt的VNC客户端
概述 使用qt和libvncclient编写vnc的客户端程序,多线程读写,拒绝卡顿。qt环境:5.15.3libvncclient:0.9.14下载地址:https://github.com/LibVNC/libvncserver/releases 编译libvncclient 打开CMakeList文件ÿ…...
视频处理基础之gradio框架实现
这些函数是用于处理视频文件的Python代码片段,它们依赖于ffmpeg和ffprobe工具,这些工具是FFmpeg项目的一部分,用于处理视频和音频数据。下面是每个函数的用途和用法的总结: 1. ffmpeg_installed() 函数: - 用途&am…...
黑马点评2——商户查询缓存(P37店铺类型查询业务添加缓存练习题答案)redis缓存、更新、穿透、雪崩、击穿、工具封装
文章目录 什么是缓存?添加Redis缓存店铺类型查询业务添加缓存练习题 缓存更新策略给查询商铺的缓存添加超时剔除和主动更新的策略 缓存穿透缓存空对象布隆过滤 缓存雪崩解决方案 缓存击穿解决方案基于互斥锁方式解决缓存击穿问题基于逻辑过期的方式解决缓存击穿问题…...
概率DP (由一道绿题引起的若干问题。目前为一些老题,蒟蒻的尝试学习1.0)
概率DP: 利用动态规划去解决 概率 期望 的题目。 概率DP 求概率(采用顺推) 从 初始状态推向结果,同一般的DP类似,只是经历了概率论知识的包装。 老题: 添加链接描述 题意: 袋子里有w只白鼠&am…...
[Python]生成器和yield关键字
生成器和yield关键字 1.生成器介绍: 概述: 它指的是 generator, 类似于以前学过的: 列表推导式, 集合推导式, 字典推导式… 作用: 降低资源消耗, 快速(批量)生成数据. 实现方式: 1.推导式写法. my_generator (i for i in range(5)) 2.yield写法. def get_gene…...
Nginx 负载均衡+高可用 集群部署(Keepalived+LVS DR模式)
一、LVS负载均衡简介 1.1 LVS基本介绍 LVS(Linux Virtual Server)即Linux虚拟服务器,是由章文嵩博士主导开发的开源负载均衡项目,目前LVS已经被集成在Linux内核中。该项目在Linux内核中实现了基于IP地址的请求数据负载均衡调度方…...
算法 | 基础 | 出现奇数次的数字
这里写自定义目录标题 异或运算题目1题目2 本篇是关于异或(^)运算的运用。后期看算法过程中如果再碰到异或的都会收录到本篇中 异或运算 在逻辑学中,逻辑算符异或(exclusive or)是对两个运算元的一种逻辑析取类型&am…...
log4j 控制台和文件输出乱码问题解决
一个小问题,却让我感觉到,现在真正动脑的人很少。。我来说说吧。 今天遇到一个小问题, log4j输出到文件乱码,控制台正常。显然是编码问题导致。Google一搜,几乎一水的说: 项目中log4j在英文版linux下输出中…...
在国产芯片上实现YOLOv5/v8图像AI识别-【4.2】RK3588获取USB摄像头图像推流RTSP更多内容见视频
本专栏主要是提供一种国产化图像识别的解决方案,专栏中实现了YOLOv5/v8在国产化芯片上的使用部署,并可以实现网页端实时查看。根据自己的具体需求可以直接产品化部署使用。 B站配套视频:https://www.bilibili.com/video/BV1or421T74f 前言…...
TCP/IP协议栈详解及其在现代网络中的应用
在当今数字化时代,网络已成为我们生活中不可或缺的一部分。无论是社交、工作还是娱乐,网络都在背后发挥着至关重要的作用。而这一切的实现,都离不开TCP/IP协议栈。本文将详细介绍TCP/IP协议栈的结构、各层功能以及它在现代网络中的应用。 什…...
亚信安全荣获“2024年网络安全优秀创新成果大赛”优胜奖
近日,由中央网信办网络安全协调局指导、中国网络安全产业联盟(CCIA)主办的“2024年网络安全优秀创新成果大赛”评选结果公布。亚信安全信舱ForCloud荣获“创新产品”优胜奖,亚信安全“宁波市政务信息化网络数据安全一体化指挥系统…...
如何从硬盘恢复已删除/丢失的文件?硬盘恢复已删除的文件技巧
如何从硬盘恢复已删除/丢失的文件?本教程将教您如何使用专业硬盘恢复软件从内置或外置硬盘恢复数据,或不使用软件从硬盘恢复已删除的文件。 “有人知道如何从外部硬盘恢复文件吗?当我将外部硬盘插入计算机时,我错误地删除了一些文…...
[Linux]:权限
✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:Linux学习 贝蒂的主页:Betty’s blog 1. Linux权限的基本概念 1.1 root与普通用户 在Linux系统中,存在…...
启动Spring Boot报错
一、遇到的问题 启动Spring Boot报错 Unable to close ApplicationContext org.springframework.boot.SpringApplication: Application run failed java.lang.IllegalStateException: Error processing condition on org.springframework.boot.autoconfigure.cache.CacheAutoCo…...
部署project_exam_system项目——及容器的编排
(一)安装docker、编辑daemon.json文件、安装docker-compose编排容器、启动docker 1.环境准备 [rootdocker--1 ~]# rz -Erz waiting to receive.[rootdocker--1 ~]# lsanaconda-ks.cfg docker.sh[rootdocker--1 ~]# source docker.sh [rootdocker--1 ~…...
网络工程师学习笔记——无线通信网
移动通信 从1G到3G都是针对语音通话设计的,只有4G才可以与Internet衔接 1978年美国贝尔实验室开发了高级移动电话系统(AMPS),可以随时随地的进行通信,采用蜂窝技术解决了公用通信系统所面临的大容量要求和…...
Vue(十三) 路由、路由嵌套、query、param传参、propos、replace属性。编程式路由导航,特有的生命周期函数,路由守卫
文章目录 路由1. 基本使用2. 多级(嵌套)路由3. 路由query传参4. 命名路由5. 路由param传参6. propos属性7. replace属性8. 编程式路由导航9. 缓存路由组件10. actived,deactived生命周期函数11. 路由守卫1、全局路由2、独享路由3、组件内路由守卫 12. 路由器工作的两…...
ArgoUML与StarUML的安装
ArgoUML与StarUML的安装 说明: 首次发表日期:2024-09-07ArgoUML 官网: https://argouml-tigris-org.github.io/tigris/argouml/StarUML 官网: https://staruml.io/ ArgoUML 以下内容基于: https://blog.csdn.net/h…...
828华为云征文|华为云服务器Flexus X搭建悟空crm管理系统——助力企业云上管理(解决APP Referer校验失败问题)
1、为什么我们企业会选择Flexus云服务器X实例来部署自己的CRM管理系统? 因为基于华为云Flexus X实例搭建CRM管理平台,可以从容面对企业内部瞬息万变的业务压力变化 2、华为云服务器Flexus X方案及优势: 灵活伸缩 搭配弹性伸缩服务AS及负载均…...
计算机毕业设计选题推荐-健康健身追踪系统-运动健身系统-Java/Python项目实战
✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…...
Phi-4-mini-reasoning应用场景:科研助理——论文公式推导验证与符号计算辅助
Phi-4-mini-reasoning应用场景:科研助理——论文公式推导验证与符号计算辅助 1. 模型概述 Phi-4-mini-reasoning是一款由微软开发的轻量级开源模型,专注于数学推理和逻辑推导任务。这个3.8B参数的模型虽然体积小巧,但在强逻辑任务上表现出色…...
05_Cursor之自定义规则与配置
关键字:.cursorrules, 自定义规则, AI模型配置, 文档集成, 终端集成, Cursor配置 05_Cursor之自定义规则与配置 Cursor知识体系 Cursor知识体系(续) | -- 配置定制层 | -- .cursorrules规则文件 | | -- 项目编码规范 | | -- 风格指…...
DTM智慧监控:构建企业级分布式事务一致性保障的终极指南
DTM智慧监控:构建企业级分布式事务一致性保障的终极指南 【免费下载链接】dtm A distributed transaction framework, supports workflow, saga, tcc, xa, 2-phase message, outbox patterns, supports many languages. 项目地址: https://gitcode.com/gh_mirrors…...
从单片机到Linux驱动的技术成长与转型
1. 从单片机到Linux驱动的技术成长之路 刚毕业那会儿,我和大多数电子工程专业的同学一样,怀揣着对技术的无限憧憬。记得大四校招时,我固执地只投递了几家知名大厂的嵌入式开发岗位,甚至在面试时直接报出了远超应届生水平的薪资期望…...
Vue2项目里用Cesium加载天地图标注,保姆级避坑指南(含Token申请)
Vue2项目集成Cesium与天地图标注的工程化实践指南 当WebGIS需求遇上Vue技术栈,如何在老项目中优雅地引入三维地图能力?本文将以工程化视角,系统讲解Vue2项目中集成Cesium加载天地图标注的完整技术路径。不同于基础教程,我们将重点…...
千问3.5-2B部署教程:GPU利用率监控脚本(nvidia-smi + prometheus exporter)
千问3.5-2B部署教程:GPU利用率监控脚本(nvidia-smi prometheus exporter) 1. 引言 在部署和使用千问3.5-2B这类视觉语言模型时,GPU资源的高效利用至关重要。本教程将手把手教你如何搭建一个轻量级的GPU监控系统,实时…...
OpenClaw自动化测试:千问3.5-27B驱动UI全流程验证
OpenClaw自动化测试:千问3.5-27B驱动UI全流程验证 1. 为什么选择OpenClaw做自动化测试? 去年接手一个前端重构项目时,我遇到了一个典型困境:每次代码改动后,都需要手动执行47个关键页面的功能测试。这套测试流程完整…...
无失效数据的产品可靠性评估案例
当所有寿命相关的试验全部通过且无失效发生时如何评价产品可靠性作者:Julius王政 关键点o 一个产品可能有几项与寿命相关的可靠性验证试验。例如,车辆中使用的电子控制模块(我们称之为 ECU)通常有以下四项与寿命相关的试…...
OpenClaw社交媒体管理:Gemma-3-12b-it自动回复评论与生成周报
OpenClaw社交媒体管理:Gemma-3-12b-it自动回复评论与生成周报 1. 为什么选择OpenClaw管理社交媒体 去年运营个人技术账号时,我每天要花1小时手动回复评论和整理周报。直到发现OpenClaw这个开源自动化框架,配合Gemma-3-12b-it模型࿰…...
Goldfish4Tech空气泵驱动库:嵌入式直流泵安全控制方案
1. Goldfish4Tech空气泵驱动库技术解析1.1 库定位与工程价值Goldfish4TechAirPump 是一款面向嵌入式平台的轻量级空气泵控制库,专为金鱼科技(Goldfish4Tech)系列微型直流空气泵设计。该库并非通用型电机驱动框架,而是针对特定硬件…...
