Jack Huang's Blog


  • 首页

  • 标签

  • 归档

  • 搜索

ProcessMonitor监控软件安装过程

发表于 2022-02-26

最近在安装Office2013的过程中,提示需要卸载已安装的Office2010,然而卸载了Office2010之后,依然提示该错误,无法安装Office2013。

分析其原因,可能是卸载Office2010不干净,在注册表中还存留Office2010的注册表信息,而当运行Office2013的Setup.exe安装程序时,刚好读到存留的Office2010注册表信息,于是Office2013的Setup.exe安装程序认为Office2010没有卸载,从而无法继续安装。

解决方法是找到并删除Office2013的Setup.exe安装程序读取的Office2010的注册表信息,该条注册表信息导致Office2013的Setup.exe无法继续。

可以使用Process Monitor监控软件解决该问题。

参考链接

  1. ProcessMonitor文件以及注册表监视器的使用,by Amrecs.
  2. 如何知道安装程序在进行安装时对你的电脑到底做了什么?,by zhaotianff.

tf.stop_gradient梯度截断作用

发表于 2022-02-24

可能会有这样的场景, 即我们可能只需要训练网络的特定部分, 然后网络的其余部分则保持未之前的状态(不进行梯度更新). tf.stop_gradient 正是为了处理这一情景的. 即在 tf.stop_gradient 中执行任何操作都不会导致在 BP 过程中梯度的更新.

参考链接

  1. 【Tensorflow】— tf.stop_gradient梯度截断作用,by 代码先锋网.

对偶问题转化

发表于 2022-02-23 | 更新于 2022-02-24

在一个优化问题中,原始问题通常会带有很多约束条件,这样直接求解原始问题往往是很困难的,于是考虑将原始问题转化为它的对偶问题,通过求解它的对偶问题来得到原始问题的解。对偶性(Duality)是凸优化问题的核心内容。

参考链接

  1. 线性规划原问题对偶问题之间的转化,一张图带你理解,by 中南自动化学院“智能控制与优化决策“至渝.
  2. 简易解说拉格朗日对偶(Lagrange duality),by 90Zeng.
  3. 拉格朗日对偶性,by Eureka.
  4. 【凸优化笔记6】-拉格朗日对偶(Lagrange duality)、KKT条件,by Lauer.
  5. 拉格朗日对偶性(Lagrance duality) 推导与简单理解,by 小鹅鹅.
  6. 拉格朗日对偶性,by 井底蛙蛙呱呱呱.
  7. 拉格朗日对偶,by Frostime.
  8. 优化方法:原问题和拉格朗日对偶问题(primal-dual),by 俎志昂.
  9. 拉格朗日对偶详解,by CodeAntenna.

最大似然估计

发表于 2022-02-22

在统计学中,最大似然估计(英语:Maximum Likelihood Estimation,简作MLE),也称极大似然估计,是用来估计一个概率模型的参数的一种方法。

$$ \begin{aligned} \ln p(x_i|\mu,\sigma) = \ln \frac{1}{\sqrt{2\pi} \sigma} \exp \left{ - \frac{(x_i-\mu)^2}{2\sigma^2} \right} \ = \left{ - \frac{(x_i-\mu)^2}{2\sigma^2} - \ln \sigma - \ln \sqrt{2\pi} \right} \end{aligned} ​$$

参考链接

  1. 最大似然估计,by wikipedia.
  2. 一文搞懂极大似然估计,by 忆臻.
  3. 高斯分布微分熵的推导,by 机器学习的小学生.
  4. 高斯分布的极大似然估计,by Yemiekai.

QT5中文乱码解决方法

发表于 2022-02-21 | 更新于 2025-07-30

问题产生

常用设置窗口标题方式:

1
2
3
4
window.setWindowTitle("中文") 

QString title = "中文"
window.setWindowTitle(title);

使用上述方式设置窗口标题将产生乱码。

原因分析

字符编码不匹配导致乱码现象。

1
2
3
4
5
6
7
8
9
10
11
12
/* 源码版本5.12 */
void QWindowsWindow::setWindowTitle(const QString &title)
{
setWindowTitle_sys(QWindowsWindow::formatWindowTitle(title));
}

/* 源码版本5.12 */
void QWindowsBaseWindow::setWindowTitle_sys(const QString &title)
{
qCDebug(lcQpaWindows) << __FUNCTION__ << this << window() << title;
SetWindowText(handle(), reinterpret_cast<const wchar_t *>(title.utf16()));
}

从源码可以看出title.utf16()最终转换为utf16字符编码。

解决方案

1
2
3
4
5
6
QString::fromUtf16(u"中文");

QString::fromLocal8Bit("中文");

// 推荐
QString str = QStringLiteral("中文文本");

参考链接

  1. QT 中文乱码解决汇总(包括QString与string、char*互转乱码),by 高祥xiang.
  2. 源码分析Qt窗口标题中文乱码的问题,by Qt君.

QT多线程及其与GUI组件的通信

发表于 2022-02-21

每个程序启动后拥有的第一个线程称为主线程,即GUI线程。QT中所有的组件类和几个相关的类只能工作在GUI线程,不能工作在次线程,次线程即工作线程,主要负责处理GUI线程卸下的工作。

每个线程都有自己的栈,因此每个线程都要自己的调用历史和本地变量。线程共享相同的地址空间。

QT线程创建方法

QThread使用方法1——重写run()函数

对于使用Qthread创建的进程而言,run()函数则是新线程的入口,run()函数退出,意味着线程的终止。

QThread使用方法2——moveToThread()

如果不想每执行一种任务就自定义一个新线程,那么可以自定义用于完成任务的类,并让它们继承自QObject。

然后使用moveToThread()将QObject对象实例移动到新线程。注意moveToThread()是QObject的公有函数。移动之后启动子线程。

多线程与GUI组件的通信

GUI系统的设计原则:所有界面组件的创建只能在GUI线程(主线程)中完成。子线程与界面组件的通信有两种方式:

  • 信号槽方式
  • 发送自定事件方式

参考链接

  1. 深入理解QT多线程编程,by 编程宝库.
  2. 零基础学 qt4 编程,by wd007.
  3. 多线程与界面组件的通信,by 程序员ITS401.
  4. QT从入门到入土(五(1))——多线程(QThread),by 唯有自己强大.

QT事件处理函数被触发两次的问题

发表于 2022-02-19 | 更新于 2022-02-21

如果用官方的写法on_btn_pressed()可以不用写connect函数,可以直接触发槽函数。如果此时用connect再次连接的话,就会导致on_btn_pressed()被执行两次。

Qt信号-槽连接函数原型如下:

1
bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection )

Qt支持5种连接方式

  • Qt::DirectConnection(直连方式)(信号与槽函数关系类似于函数调用,同步执行)

当信号发出后,相应的槽函数将立即被调用。emit语句后的代码将在所有槽函数执行完毕后被执行。
当信号发射时,槽函数将直接被调用。
无论槽函数所属对象在哪个线程,槽函数都在发射信号的线程内执行。

  • Qt::QueuedConnection(队列方式)(此时信号被塞到事件队列里,信号与槽函数关系类似于消息通信,异步执行)

当信号发出后,排队到信号队列中,需等到接收对象所属线程的事件循环取得控制权时才取得该信号,调用相应的槽函数。emit语句后的代码将在发出信号后立即被执行,无需等待槽函数执行完毕。
当控制权回到接收者所依附线程的事件循环时,槽函数被调用。
槽函数在接收者所依附线程执行。

  • Qt::AutoConnection(自动方式)

Qt的默认连接方式,如果信号的发出和接收信号的对象同属一个线程,那个工作方式与直连方式相同;否则工作方式与队列方式相同。
如果信号在接收者所依附的线程内发射,则等同于直接连接
如果发射信号的线程和接受者所依附的线程不同,则等同于队列连接

  • Qt::BlockingQueuedConnection(信号和槽必须在不同的线程中,否则就产生死锁)

槽函数的调用情形和Queued Connection相同,不同的是当前的线程会阻塞住,直到槽函数返回。

  • Qt::UniqueConnection

与默认工作方式相同,只是不能重复连接相同的信号和槽,因为如果重复连接就会导致一个信号发出,对应槽函数就会执行多次。

参考链接

  1. QT按钮被触发两次的问题,by 不二侬.
  2. QVariant的用法,by 十年之少.
  3. QT入门系列(4):QString与int相互转换方法,by 李奕锋.
  4. 深入理解QT多线程编程,by 编程宝库.
  5. 在Qt(C++)中使用QThread实现多线程,by 星夜之夏.
  6. Q_OBJECT宏的作用,by 沈子恒.

VS2017+QT5.8.0时,新建GUI应用程序编译报错的问题

发表于 2022-02-19 | 更新于 2022-07-20

使用VS2017+QT5.8.0时,报如下错误:

1
2
严重性	代码	说明	项目	文件	行	禁止显示状态
错误 C3615 constexpr 函数 "QAlgorithmsPrivate::qt_builtin_ctz" 不会生成常数表达式 (编译源文件 BaitLaunchingstrategy.cpp) Simulation d:\qt\qt5.8.0\5.8\msvc2015_64\include\qtcore\qalgorithms.h 593

解决方法请参考VS2017/2015 静态编译Qt 5.8_帝江VII的博客-程序员宝宝。

参考链接

  1. 使用VS2017+QT5.8.0时,新建GUI应用程序,编译报错的问题解决,by 麻辣鸡丝GIS.
  2. VS2017/2015 静态编译Qt 5.8_帝江VII的博客-程序员宝宝,by 程序员宝宝.

极大极小算法

发表于 2022-02-13

Minimax算法又名极小化极大算法,是一种找出失败的最大可能性中的最小值的算法。常用于棋类等由两方较量的游戏和程序。该算法是一个零总和算法,即一方要在可选的选项中选择将其优势最大化的选择,另一方则选择令对手优势最小化的方法。

1
2
3
4
5
6
7
8
9
10
11
12
function minimax(node, depth)
if node is a terminal node or depth = 0
return the heuristic value of node
if the adversary is to play at node
let α := +∞
foreach child of node
α := min(α, minimax(child, depth-1))
else {we are to play at node}
let α := -∞
foreach child of node
α := max(α, minimax(child, depth-1))
return α

参考链接

  1. 一张图读懂极大极小搜索和α-β剪枝,by housong_csdn.
  2. 极小化极大算法,by wikipedia.

VSCode中Python调试方法

发表于 2022-01-28

Python代码中设置了arg paser,需要手动设置,VS code的debug没有简单的添加参数的方式,需要创建launch.json文件配置调试参数,具体方法见vscode 调试python代码时添加参数(args)。

参考链接

  1. vscode 调试python代码时添加参数(args),by zk0272.
上一页1…171819…53下一页

Jack Huang

523 日志
67 标签
© 2025 Jack Huang
由 Hexo 强力驱动
|
主题 — NexT.Muse