自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

猪在黑魔纹里

coding is what i've lived for.

  • 博客(44)
  • 收藏
  • 关注

原创 Java 浅析线程池ThreadPoolExecutor

线程池需要掌握:使用线程池的好处:在《阿里巴巴开发手册》中有提到,不允许使用Executors去创建线程池,而是用更底层的ThreadPoolExecutor创建线程池。—上文提到使用ThreadPoolExecutor创建线程池,我们来看一下ThreadPoolExecutor构造函数的参数:Executors.newSingleThreadExecutor 和 Executors.newFixedThreadPool 实际上就是设置了 corePoolSize 和 maximumPoolSize

2022-06-28 16:19:45 238 1

原创 Java BlockingQueue阻塞队列的四组API

BlockingQueue是FIFO(先进先出)型队列,他很好的解决了多线程中,如何高效安全“传输”数据的问题。本文会介绍BlockingQueue常用的四组api以及他们之间的不同之处。运行结果:add(e)异常:remove( )异常:element( )异常运行结果:运行结果:当队列没有剩余位置可以插入元素,或没有元素可以取出时,会一直阻塞。运行结果:带参数的offer(e, timeout, unit):带参数的poll(timeout, unit):......

2022-06-28 12:18:26 324

原创 Java 使用Lock、Condition的生产者与消费者问题(JUC)

synchronized 与 Lock 的区别:说到 Lock 就不得不说 Condition ,官方文档中关于Condition的解释:Lock -> synchronizedCondition.await() -> Object.wait()Condition.signalAll() -> Object.notifyAll();代码实现:通过Condition进行精准的通知和唤醒:结果如下:......

2022-06-27 13:59:13 326

原创 Java 传统的生产者与消费问题以及虚假唤醒

synchronize版生产者与消费者问题、多线程虚假唤醒

2022-06-27 10:31:35 146

原创 Java TCP实现文件传输

**server端流程:**创建ServerSocket对象,指名端口号。调用accept( )方法,获取客户端socket。创建输入流,用于读取网络数据。创建文件输出流, 将数据输出为文件。创建输出流,发送反馈信息。public void server() throws IOException { try (ServerSocket server = new ServerSocket(9090); Socket socket = server.

2022-05-24 10:44:01 1792

原创 Java 多线程之实现Callable

实现Callable为JDK5新增功能,和实现Runnable相比,借助FutureTask类可以实现更加强大的功能,使用起来更加灵活:相比run方法,call方法可以有返回值。方法可以抛出异常。支持泛型的返回值。演示示例:class MyThread implements Callable { @override public Object call() throws Exception { 业务代码 return xxx; }}public static void m

2022-04-19 11:17:22 1072

原创 Java 多线程之继承Thread和实现Runnable的区别

继承Tread类 class MyThread extends Thread{ @overwrite public void run(){ 业务流程 }}public static void main(String[] args){ MyThread mt = new MyTread(); mt.start();}实现Runnable接口 class MyThread implements Runnable{ @overwrite

2022-04-18 20:16:13 415

原创 树莓派发布qt release程序并开机自启动显示终端

打包程序1.在release模式下编译代码,将build-xxx release文件夹中生成的执行文件复制到自己的执行文件夹中,我这里是放在`/home/pi/output`中. 2.在output文件夹中新建脚本`cplib.sh`:此脚本会将程序依赖库复制到当前文件夹中.#!/bin/sh exe="vivoMES" # 修改发布程序的名称des="/home/pi/output/" # 修改输出可执行文件路径deplist=$(ldd $exe | awk '{.

2022-04-06 12:35:31 901 3

原创 QtCreator中ToDo插件

[帮助] =======> [关于插件]根据提示重启生效[工具] =======> [选项]之后在注释里添加 // TODO 就会自动添加在To-Do事项里了!

2022-04-01 14:03:38 319

原创 C++ auto关键字浅析

auto 关键字是从c++11标准引入的,实际用起来还是非常爽的!

2022-03-15 16:26:39 1091

原创 Qt QString().sprintf(“%x“)解决打印无符号十六位数

场景:最近使用海康工业相机的SDK进行二次开发,打印出来的函数返回错误码总是怪怪的,和开发手册里的对不上号,其实就是无符号十六位被Qt默认转成了int型,然后传到QString代码:在MFC的Demo里他是这么写的:cstrInfo.Format(_T("Get hight failed! err code:%#x"), nRet);而我是这么写的:QString("%1 = Fail error code:%2").arg(str).arg(nRet);打印结果很残酷,转成十六进制数我

2022-03-11 15:49:23 2889

原创 C++ explicit关键字浅析

对于单参构造函数、首项参数无默认值的构造函数,为了不让c++太放飞自我,十分建议使用 explicit 关键字,取消编译器执行一些非预期的类型转换!

2022-03-10 11:04:52 1229

原创 Qt多线程[QMessageBox]Cannot set parent, new parent is in a different thread以及connect注意事项

Cannot set parent, new parent is in a different threadlamda表达式的注意事项信号发出,槽函数不执行

2022-03-09 16:46:28 6838 2

原创 Qt获取本地有效mac地址

获取有效mac地址//获取当前有效网卡QString strMac;QList<QNetworkInterface> ifaces = QNetworkInterface::allInterfaces();//获取所有网卡信息for (int i = 0; i < ifaces.count(); i++){ QNetworkInterface iface = ifaces.at(i); if ( iface.flags().testFlag(QNetwork.

2021-07-05 14:36:28 1863

原创 Qt信号与槽执行频繁导致程序崩溃

问题情景:使用Qt编写运动控制上位机时,需要读取IO端口信号,并根据读取到的信号将传感器的状态显示在主界面。由于没办法读取到电平的上升沿或下降沿变化,所以只能在循环内一直读取IO的电平,而IO端口数量比较多,大概有30个。如果读到电平后就发送信号,告知MainWindow更新控件,会导致程序崩溃。解决方法:限制信号发送的频率,当IO电平是持续高电平或持续低电平时,此时发送的信号都是无意义的。可以新添加一个temp变量,用来储存上一个电平信号。当读取到电平时,先判断当前电平和temp是否相等,不

2021-03-10 11:37:50 3371

原创 Qt使用findChild函数,使用循环遍历访问多个控件

使用场景:在工程中通常都会碰到需要访问大量且功能重复的控件,比如更改label的显示文本,改变颜色等。Qt中findChild函数可以很方便的实现这一步骤。代码说明:用QLabel模拟IO信号灯,需要在读取到低电平时让IO信号灯呈现绿色。UI中Label的名字统一为"led_x"( x为数字 ).for(int i=0; i<16; i++){ // label名字为led_0、led_1...led_15 QLabel *led = this->findChild&l

2021-03-10 11:24:28 2646

原创 QSettings保存、读取配置文件

基本用法:QSettings API基于QVariant,通过键值对的形式保存参数。QSettings在使用时需要声明公司或组织名称以及产品名称,简单点说其实就是先声明 [ 结点名字 ],在结点下再声明 [ 键名 ] 以及对应的 [ 值 ] 。// 配置文件以ini的形式保存QString fileName = QCoreApplication::applicationDirPath() + "/Config.ini";// 实例化QSettings对象QSettings *setting

2021-03-06 14:57:21 3113

原创 Qt添加pri子工程,功能模块化

为了让项目文件不那么臃肿,在根目录下新建文件夹,并在文件夹中新建xxx.pri的文件。在工程的pro文件中添加如下代码:INCLUDEPATH +=$$PWD/include# 可以添加多个pri工程include(./electric_control/electric_control.pri)重新编译,子模块便会加入到当前工程中。...

2021-02-22 16:56:15 603

原创 jupyter中添加python3

# 首先安装ipykernel包pip3 install ipykernel# 等待安装完成,查看conda运行目录:conda info --evns# 根据目录下的python给ipykernel添加python3(conda里是不识别python3这个命令的):D:\Anaconda\pyhton -m ipykernel install --name Python3 # name后面的名字是自定义的# 完成后查看jupyter的kernel list:jupyter kernelsp

2021-02-21 16:59:34 2119 2

原创 C++提高程序鲁棒性防止空指针访问成员函数

首先定义一个类,有两个成员函数,其中一个会访问私有变量。class Person{public: void info() { cout << "this is a nullptr" << endl; } int showAge() { return m_Age; }private: int m_Age;};创建一个空指针,访问这两个成员函数。结果并不是两个两个函数都会报错,只有在空指针调用含有指定对象的成员函数时才会报错。而p->info(

2020-12-10 20:05:57 345

原创 C++值返回和引用返回的区别

现有一个Point类class Point{public: void setX(int x)//公共接口 { X = x; } int getX() { return X; } void setY(int y) { Y = y; } int getY() { return Y; } Point addXY_1(int x,int y)//值返回 { X += x; Y += y; return *this; } Point& addX

2020-12-10 19:13:01 1585 3

原创 C++构造函数的调用规则

构造函数的调用规则默认情况下,编译器至少给一个类添加3个函数:默认构造函数(无参,函数体为空)默认析构函数(无参,函数体为空)拷贝构造函数(对属性进行值拷贝)如果在类中定义了有参构造函数,编译器不再提供默认无参构造函数,但是会提供拷贝构造函数。如果在类中定义了拷贝构造函数,编译器不再提供其他构造函数。...

2020-12-10 15:29:18 110

原创 C++如何重载构造函数

构造函数如果在C++中实例化类时我们没有人为的使用构造函数,编译器会自动将构造函数空实现(调用构造函数但函数体内为空)。构造函数的作用是初始化类,当一个类被实例化时,首先被执行的就是构造函数。构造函数有三种类型:无参构造(默认构造)class Point{public: Point()//无参构造 { ... };};有参构造class Point{public: Point(int a)//有参构造 { ... };};拷贝构造class P

2020-12-10 15:07:53 907

原创 C++函数重载二义性问题

函数重载函数在同一个作用域。函数名相同。函数参数不同,或参数顺序不同。比如:void test(int a){ cout << "1" << endl;}void test(double a){ cout << "2" << endl;}特殊情况:当重载函数有默认参数时void test(int a,int b = 10){ cout << "1" << endl;}void test(int

2020-12-04 11:05:53 407

原创 C++引用的意义及用法

C++引用C++中引用变量是一个别名,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。C++ 引用 vs 指针引用很容易与指针混淆,它们之间有三个主要的不同:不存在空引用。引用必须连接到一块合法的内存。一旦引用被初始化为一个对象,就不能被指向到另一个对象,有点类似指针常量。指针可以在任何时候指向到另一个对象。引用必须在创建时被初始化。指针可以在任何时间被初始化。int a = 10;int &b = a;//引用,此时a,b操

2020-12-04 10:19:25 620

原创 C++内存相关,如何使用new和delete

C++程序在执行时,将内存大方向划分为4各区域:代码区:存放函数体的二进制代码,由操作系统进行管理。全局区:存放全局变量和静态变量以及常量。栈区:由编译器自动分配释放,存放函数的参数值、局部变量等。堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收。内存四区的意义:不同区域存放的数据,赋予不同的生命周期,使编程更加灵活。注意事项:对于栈区数据,不要返回局部变量的地址。int * func(){ int a =10;//局部变量存放在栈区,栈区的数据在函数执

2020-12-03 17:23:15 287

原创 C++指针在函数中的用法

函数中的数值传递分为值传递和地址传递。值传递是单纯的复制,修改的只是形参。void swap(int a, int b){ int temp = a; a = b; b = temp; cout << "swap a = " << a << endl; cout << "swap b = " << b << endl;}地址传递是由形参复制实参的地址,通过解引用的方式访问这个地址,修改后得到的是实参地址上的数据,也

2020-12-03 11:53:42 210

原创 C++指针知识点浅析

指针是一种特殊的变量,他可以指向数据的内存地址,并且可以通过解引用的方式修改内存地址所对应的数据。通过 & 取值符可以获得数据对应的地址,通过 * 对指针解引用可以修改地址对应的数据。 int a = 10; int *p; p = &a;//&取值符,访问值对应的内存 int *p = &a。 cout << "解引用前 a = " << a << " a的地址为 &a = " << &a <

2020-12-03 11:04:31 155

原创 Qt在树莓派中根据心跳包的返回值同步服务器时间

在之前的项目中需要根据服务器返回心跳包的值来设置本地时间。我是通过编写shell脚本,将更改时间的命令行写在脚本里,使用QProcess调用脚本,这部分在Qt中调用system()和QProcess执行命令行,更改树莓派的系统时间中有说明。这里主要将通过QFile改写脚本文件,将服务器给的时间当作参数写入脚本文件。(网上好像有shell脚本直接使用参数的方法,当时我没有了解到)QFile有读写文件的功能QFile readFile(/.....)//读取文件路径readFile.open(QIODe

2020-12-01 17:07:38 184

原创 Qt不同界面通信问题详解(四种情况)

在初学Qt时这种不同界面、跨类通信的问题困扰了我很久,而且网上很少有文章完整的介绍Qt中不同的跨类通信问题,现在项目完结正好总结一下自己的想法。比如现在有三个界面类,分别为A、B、C,其中A为父类,B、C都为A的子类界面。① 最常见的情况是子类向父类发送信号,在父类执行槽函数。B→A (C→A)//A.cpp#include "A.h"#include "B.h"B *b = new B(this);connect(b,&B::sig,this,&A::slot);//c

2020-11-30 16:14:39 2120 5

原创 Qt使用moveToThread( )正确的开启多线程、安全的退出线程

Qt中开启多线程有两种方式,一种是重构run函数,另一种是moveToThread的方式,这里我主要介绍一下moveToThread,这是Qt4.8后新增的功能,也是Qt开发者极力推荐使用的多线程方式。首先需要为子线程单独创建一个类,继承QObject。如上图,让耗时函数在worker类中执行。之后在主线程引用此类的头文件和QThread,并实例化耗时类对象和线程对象。#include <QThread>#include "worker.h"QThread my_thread;

2020-11-30 10:13:49 15165 7

原创 Qt中调用system()和QProcess执行命令行,更改树莓派的系统时间

最近给vivo做的设备需要连接MES生产内网,要求机器根据心跳包返回值来同步服务器时间。而这一步操作需要在上位机程序中执行,也就是在Qt中调用命令行或者更改配置文件来设置系统时间。树莓派更改系统时间的方法很多,在这里我介绍两种比较方便的:① 使用命令行:sudo date --s=“2020-11-28 14:30:00”② 编写shell脚本,通过调用shell脚本执行命令行。新建"systime.sh"脚本,在脚本中写入:#! bin/bashsudo date --s="2020-11-2

2020-11-28 17:02:46 4013

原创 C++冒泡排序

冒泡排序原理:在一个长度为n的数组中(arr[n]),从头开始直至最后一个元素,每次比较相邻的两个元素(i、i+1),如果前者比后者大,则交换两者的位置。每轮会进行n-1次比较,挑选出本轮中最大的元素并置于数组末尾,此元素不参与下一轮比较。最后一轮比较至还剩两个元素,至此冒泡排序结束,一共会进行n-1次比较。总结一下:数组长度为n,每次比较arr[i]、arr[i+1],一共进行n-1轮比较,每轮比较(n-轮数)组相邻两元素,每轮比较会选出最大值不参与下一轮比较。#include <iostr

2020-11-20 19:52:14 70

原创 树莓派配置静态ip地址

打开文件:vim /etc/dhcpcd.conf修改:interface eth0static ip_address=xxxx;静态ipstatic routers=xxxx;路由static domain_name_servers=xxx;DNS其中interface表示网线接口,eth0表示第一块网卡

2020-11-17 20:20:23 200

原创 树莓派设置desktop文件,开机自动执行终端

树莓派设置开机自启动脚本:在/home/pi界面右键,显示隐藏文件进入/.config/autostart,在此目录下新建文件text.desktop(注意:后缀必须为desktop,文件名字随意),用vim编辑器打开:vim /home/pi/.config/autostart/test.desktop。如果没有autostart目录,创建一个就行。编辑:[Desktop Entry]Categories=Application;Programme;Encoding=UTF-8Exec=

2020-11-17 20:18:21 1862

原创 C++枚举水仙花数

水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身(例如:1^3 + 5^3+ 3^3 = 153)。思路很简单,首先水仙花数的取值范围是100~999,判断条件是个十百位各自的3次幂之和等于这个数本身。现在问题就转换为取三位数的个位、十位、百位。很自然的想到取

2020-11-16 16:12:33 647

原创 Qt中接收串口数据不完整、分段的解决方法

最进在串口通信时碰到了一个问题,向485串口发送指定报文,会收到一条关于压力数值的数据。但我将其qDebug打印出来却发现数据被分成了两部分依次打印,之后通过验证我确定了问题出在readyRead的信号与槽这一部分。连接函数: connect(my_serialport,&QSerialPort::readyRead,this,&MainWindow::readMyCom);在槽函数readyRead的入口处加入 qDebug()<<"-"; 可以发现 “-” 连同分段的

2020-11-04 08:58:34 11044 7

原创 Qt中串口通信,十六进制进制转换问题

在与串口通信时,我需要给串口发送指定报文格式的命令,在接收到串口返回的数据后需要转换成浮点数并且显示出来。这里讲一下我自己碰到的问题,以及我发现的解决方法,如果大家有更好的方法可以在下方留言一起讨论。为了模拟真实的串口通信环境,我这里是用自己写的软件和在网上下载的串口助手进行数据交互。由串口助手发送"42F6CCCD",在自己写的窗口中转换成浮点数并显示。然而本应该显示"123.4",但是显示出来却变成"6.27543e-41",显然肯定是有问题的。 QByteArray strhex = my_

2020-10-28 15:12:50 4285 4

原创 Qt编写简易串口助手,实现数据收发

近期有个项目需要通过Qt进行串口通信,本文的目的是简单的记录Qt中串口相关类以及函数的使用方法。Qt中已经封装好了串口的类:QSerialPort、QSerialPortInfo。QSerialPort类提供了操作串口的各种接口;QSerialPortInfo类提供计算机内可用串口的各种信息,起辅助作用。在Qt中调用串口相关类时,需要在pro文件中加入:QT += serialport并引入相关头文件:#include <QtSerialPort/QSerialPort&g

2020-10-27 14:19:40 1590 2

原创 Qt中文字符串显示报错、乱码解决方法

在Qt中使用字符串QString时经常会碰到莫名其妙的报错,比如:this->setWindowTitle("简易串口助手");//error: C2001: 常量中有换行符对于这种情况,通常只要在字符串的末尾加一个空格,使中文和引号隔开即可:this->setWindowTitle("简易串口助手 ");但有时,即便是这样可以编译通过但还是会显示乱码:此时只需要在工程的pro文件中加入下列代码,并将字符串代码修改一下,即可解决中文字符串乱码问题,但这只针对msvc编译器可行,其

2020-10-27 11:12:24 6374 2

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除