跳至主要內容
Qt 中多线程间传递信号经验总结

有一个程序,都写了大半年了,之前定义的一套信号机制挺好用的,但改成多线程之后,发现根本不能触发了。

开始怀疑是线程忙等问题,还尝试加QApplication::processEvents()等手段,一无所获。

折腾一天之后,看了一眼调试控制台的输出信息,发现问题其实造给我明白输出在调试控制台里面了:

我在信号中传递了一个自定义类型的数据。在单线程模式下,这样的传递随意写。但是,如果要跨线程传递信号,信号的参数就必须是注册过的“Qt元类型”。否则,即使是一个简单的枚举量,也是不能跨线程传递的,这个问题在编译时没有警告。


魏大帅大约 7 分钟编程C/C++Qt线程
Qt/CMake 下谜一般的 LNK2001 问题

今天第三次被这个问题坑了,不写不行。

问题很简单,就是你写了一个类,继承了Qt的某个类,有Q_OBJECT宏。

然后编译一点事都没有,链接的时候出问题了,死活都报LNK 2001错误,这时候你如果不仔细看错误信息去搜,一堆的让你加lib引用一类的信息,当然是没用。

仔细看错误信息,典型情况下是四个符号找不到,都是staticMetaObject一类一眼就能看出来是Qt内部函数的那种符号,但你的类里面命名不可能写这样的声明。想必是Qt引入的,但Qt为什么会只声明不实现?


魏大帅大约 2 分钟编程C/C++Qt编译
在Nextcloud中部署OnlyOffice并设置只读模式

OnlyOffice文档服务的单独安装

大文件问题的解决

只读模式

就我而言,搞OnlyOffice主要是为在线预览,以及缩略图生成等,基本上不会在线编辑。 虽然OnlyOffice现在的兼容性做的很好了,但还是没达到让我放心编辑文件的程度,毕竟本地又不是没有巨硬版。

同时,OnlyOffice又有一个无法关闭的“自动保存”功能,默认情况下基本上是打开之后就开始保存,不小心点一下键盘就是一个新版本存上去的, 倒不是可惜这点硬盘,主要是担心他给我一保存,把一些文件里面的格式弄坏了,或者图片变成低分辨率了,公式无法编辑了等等。


魏大帅大约 2 分钟网络服务办公日常上云自建服务dockerOnlyOffice
使用 CMake/MSVC 时指定工具链版本

在命令行传递形如-T host=x64,version=14.32.17.2的命令行, 或者在首次执行Configure时, 在图形界面最下面的Optional Toolset文本框(那里标注了这是传递给-T)中填入形如host=x64,version=14.32.17.2的选项, 并且在下面的四个单选框中选中“specific native compilers”。

指定 Windows SDK 版本


魏大帅大约 2 分钟编程C/C++CMakeninja编译跨平台
使用 nut 代替 UPS 管理软件 WinPower 实现 ESXi 自动关机

小打小闹方案,一般是一个 UPS,串口(或者转USB)线连接主机,主机上跑 ESXi,希望断电时自动关机。 由于 ESXi 本身基本上没啥 UPS 驱动功能(企业级环境下似乎也不怎么需要 ESXi 主机自己管理), 一般是单独拿一个虚拟机跑管理软件,必要时给 ESXi 发送关机信号。

这个时候,如果厂家给的管理软件用不起来,就十分闹心了。 参加本文第二节,“WinPower 加山特厂家坑我两次的历史”。

最终,发现使用开源的nut管理软件,理论上可以实现全部功能,并且很有可能比厂家给的软件还稳定。 因为这玩意儿可以配置为一个 Linux Systemd 服务,可以自己编脚本控制和监控, 并且有人为 ESXi 专门编写了客户端。


魏大帅大约 6 分钟硬件UPS自建服务
Veeam Backup & Replication 的邮件通知设定 - QQ 邮箱

这两天在尝试 Veeam Backup & Replication 做 All in Boom 的备份。

一开始其实是打算用傲梅企业备份旗舰版的,也有基于 ESXi 接口的备份, 但不得不说这个软件截止写文章时还不成熟,只能推测傲梅公司的资源都拿去做单机版了。 傲梅企业备份旗舰版在我手里有备份慢(目标机械盘100%活动时间但速度只有20M,看起来是软件实现优化问题)、 频繁出现根本不可能的“目标盘已满或无法写入”等问题,3台机器的免费名额也捉襟见肘。 虽然不介意花钱,但备份慢和失败的问题挡住了我。

相反,Veeam Backup & Replication 现在有社区版,大部分功能都开放,有10台机器的免费名额,就基本够用了。


魏大帅大约 2 分钟虚拟化备份ESXiveeam
ESXi 服务器的时区和 UTC 设置

本文基于 ESXi 8U2 编写,不对其他版本尤其是旧版本负责。

今天配置 ESXi 的自动备份的时候才发现,关于时间这里有一个极其容易掉进去的大坑。

ESXi 服务器的时间是UTC时间,无法更改。但关于这一点的提示,无论在安装时还是日常使用时都似乎不够醒目。

同时,ESXi 的vm-tools默认是关闭了时间同步选项的,也没有开网络同步选项。

而一般我们在里面的装的 Linux 会自己去网络上同步时间,如果只看客户机 Linux ,很容易根本不会发现时间设置有问题, 直到你装好第一台 Windows 客户机并且开始关注系统时间。


魏大帅大约 2 分钟虚拟化ESXi自建服务时间
MATLAB 中使用 imshow 在坐标区中画图

MATLAB 中的imshow函数,默认是单独弹窗显示。 这在自己调算法的时候无所谓甚至可能更方便,但在需要整洁的时候就比较烦, 例如在便携需要发布的 APP 的时候。

按理说不是多难的问题,但网上排前列的教程比较奇怪,是让人先把坐标区单位改像素, 然后获取尺寸,然后把图像resize到坐标区大小,然后使用axes函数(大概是吧?记不太清) 指定下一次画图所在的坐标区,最后再朴素地调用一次imshow函数,达到目的。

实际上,MATLAB对这种需求是提供了直接接口的:


魏大帅大约 1 分钟开发工具MATLAB编程技巧
从官方安装包自制绿色版 JRE/JDK

程序打包时经常需要内嵌 JRE 甚至 JDK,网上当然有下载,但终究是不太放心。

自己做的方法其实挺简单,但网上的过时说法比较多,重新记录一下。

  1. 安装7z软件,NanaZip这类二次封装的也无妨;
  2. 拿到官方的安装包,exe格式的,强行用7z打开,解压,得到一个tools.zip
  3. tools.zip再解压一次,得到一堆文件;
  4. 在这一堆文件所得目录下,执行下列cmd指令(别用powershell,不兼容):

魏大帅大约 1 分钟开发工具安装打包Java