wxWidgets似乎没有事件广播机制

wxWidgets的任意object产生了事件之后,似乎只能向父层传递,并且“一路向上”的往上传递。既不能向下传递、也不能横向传递。换言之,wxWidgets的事件是不能进行“广播”的。虽然没有通读过所有关于wxWidgets的文档,但是感觉上面的结论应该是准确的。 如果将整个窗口及上面所有的组件看做一颗“树”,任意节点上产生的事件,在“不能广播”的前提下,唯有这个节点的“父亲”是唯一的。 如果这个事件可以“向下传递”,那么任意节点下面的子节点有可能是多个,向下传递意味着就是“广播给所有的子节点”。 同理,如果能够横向传递,必然是先从当前节点向上传递给父节点,再由父节点广播给所有子节点,才能令兄弟节点收到消息。或者换一种想法,任意节点的兄弟节点也可能是多个,所以“横向传递”意味着有多个兄弟节点等待接收事件,由成了广播机制。 所以“没有广播能力”就意味着不能向子节点和兄弟节点发送事件。反之:不能向子节点发送通知就是在说不能进行广播。两种表述是一样的,就是不能只依靠事件对项目进行彻底的解耦开发。 没有广播机制,程序的解耦程度会大打折扣。我现在就遇到了好几处问题。总要迂回着完成事件的传递、或由“中间人”帮忙进行控制的操纵,代码写的凌乱不说、更重要的是这样“千回百转的羊肠小路”做控制的纽带,总担心日后会忘记它们之间的联系。 另一方面,这条“羊肠小径”无论多么的纵曲幽深,都一定不能中断。但是对于复杂的窗口应用程序、尤其是还在不断调整的开发阶段,页面上的控件总会不断地调整、新建、删除,不断的做出重新规划,每一次规划都要想着其中不知有多少“羊肠小径”需要连带着调整。既痛苦、又易出错。 虽然现在我用了一个全局单例来缓解问题,令代码可以尽可能的解耦;也缓解了组件的迁移需要不断调整众多“羊肠小径”的尴尬,但终归觉得还是不完美。此时此刻,这个痛苦的问题,着实令我有些疲倦。

wxWidgets框架下程序的正确终止方式

我正在基于wxWidgets3.2.5写一个小工具,这个小程序并非只有一个MyFrame,而是可能会在不同的场景中有不同的窗口被创建并显示出来、仅仅依靠Frame的Close按钮,是不能将程序真正结束掉的,即使有一些方法可以将程序终止掉,但用得不对则可能导致出现内存泄漏。虽然程序终止的时刻产生内存泄漏并不是什么问题,因为泄露的内存最终由系统回收了,但找到正确的程序终止方式,终归是有益无害的。 待续 update 2024.05.15:因为我最终决定放弃使用wxWidgets框架进行软件的开发,所以这篇文章的“待续”部分也就没有必要写了。

经过三组RC网络相移之后的电压波动

本文尚未完成,内容还有错误,只当参考资料阅读。 一、问题的提出 有了前面的结论,可以知道电容电压跟随交流电源电压的关系,是满足下面的方程的: 1、这个方程中的 Vm / [(1+(wRC)^2)^(1/2)] 可以被视为A,这个A就是电容电压波形中的峰值。也就是说:在电源正弦的作用下,电容上的电压形成了一个新的正弦波(虽然并不是完整的正弦、起始瞬态略有畸变),这个新形成的“正弦波”的波峰是A; 2、方程中的-arctan(wRC)被视为相移角φ,也就是电容正弦错后于电源正弦的相移; 3、那么新的正弦波的频率呢?频率是不变的。它的频率是和电源频率相同的,只是波峰略低、相位略微向右偏移。 有了如上概念之后,就可以完成以下的两个问题的解答: 1、如何构建一个完美的60°相移,然后通过3组RC相移,完成180°的相移; 2、在进行了180°相移之后的第三组RC网络的输出电压,波峰是多大?也就是说最终反馈回控制极的电压有多少? 这篇博客,将完成上面2个问题的计算和整理。 二、为了实现60°的单组RC相移,重新进行相关元件的参数设置 电源电压峰值:12V。之所以要将电源电压定义为12V,目的是与Jack Kilby的实验相符。在我阅读的相关书籍中提到,他在实验室中用12V直流电开始实验,并在示波器上看到了令人激动的振荡波型; 电源频率:暂定100Hz。之所以要定义成100Hz,是为了方便绘图观察。后期可以重新调整这个频率; 电容:1uF,也就是0.000001F; 电阻:之前我在仿真中是直接使用的1000Ω,现在按照相移角为60°进行计算,电阻应该使用2760Ω。这里还有一个额外的问题:为什么之前仿真中,电容使用1kΩ也可以正常振荡呢?这个问题需要以后有时间了,再深入推敲一下; 如上的基本参数就定义好了,按照上面定义的参数,进行绘图,然后进行仿真,看绘图计算结果与仿真结果是否一致。 三、三组RC相移之后的最终波形及电压 其实有了上面的计算依据之后,不画图也可以计算出经过3次RC相移之后的最终输出电压峰值是多大了。因为经过一组RC之后的电压峰值是A,所以经过3组RC之后的电压峰值是A的三次方。因而,如果电源电压的峰值时12V,那么: 经过第一组RC之后的电压将会是6V左右;第二组RC之后的电压将是3V;第三组之后的电压将是1.5V。也就是说最终反馈回控制极的电压的波动将在+1.5V ~ -1.5V之间。 下面是使用SageMath完成的画图,从只有电源电压开始、一条条的增加新的电容电压曲线。需要注意的是要忽略掉曲线开始瞬态部分的失真情况:…

电容电压跟随电源电压的过程(2)

一、问题的提出 在上一篇博客《电容电压跟随电源电压的过程》中,基本搞清楚了电容的充电过程和放电过程电压的变化规律。但是它对我想了解的电路而言太基础了,根本无法指导我对当前电路的分析。 我更想搞清楚的是当电源为交流电时,电容电压的跟随情况,如下图所示: 图中的电源是100Hz的5V交流电,可以看到在电容上形成的电压的峰值(红线)略微低于5V,并且是滞后于电源电压的。这在网上已经有不少公式说明了它们之间的关系,但是却没有给出推导过程。 并且更为令我不安的,是这些现成的公式都是指电路进入“稳态”之后,而在上电的起始阶段,可以看出电容与电源之间的电压并不出现相位差。 所以在我想来,这个“现成的公式”是无法解答我的困惑的,所以这篇文章以及接下来的一段日子,我将尽可能搞清这个问题:电容电压是如何跟随交流电压的。 二、困扰 又陷入了“AI胡说”的困扰,这篇博客提出来的问题,我自认为问题定义的还是比较清晰的,但却找不到准确的文献。如果继续执着于利用搜索引擎或AI问答引擎,恐怕接下来要浪费的时间将是巨大的。 其实我觉得这个问题应该比较容易,它只是在解如下的方程: 这似乎没什么难度,但因为缺少相关的参考资料,所以我很难确定自己的推导过程每一步是否准确。尤其又因为我自己解出的答案,绘制成图形之后和预期的图形相差太远——因而可以确定我的求解是错误的。 有些不知该如何继续了。 三、找到了正确的计算公式、虽然并不完美 经过多次的搜索、查找,终于找到了一篇“正确的”参考资料: https://www.iitp.ac.in/~siva/2016/ee101/Sinusoidal_Steady_State_Analysis.pdf 之所以可以认为这篇参考资料是正确的,是因为基于这篇资料计算电容电压,绘制出来的电容电压的波形是准确的(相移角准确、电容可以得到的最大电压准确、并且是稳定持续输出的): 这很不容易!我之前一个下午都在使用AI问答引擎找答案,结果给出来的各个计算公式都不正确。直到晚饭之后,都已经准备放弃了。但不甘心又找了一下,才找到上面这篇文档。 虽然这个文档给出的结论并不是我要的最终结论——它显然缺少系统上电的起始阶段的分析和曲线。但至少有了稳态之后的正确公式,可以先把后面的知识了解、掌握一下。 四、瞬态响应阶段和稳态阶段的完美波形 我感觉自己是找到“宝”了,上面的参考文档实际上是准确、完美的。只不过起初找到的时候没有细看,草草的照葫芦画瓢画了个初步的图形。细看之下,这篇文档实际上是含有初始瞬态响应阶段的分析的。按照最终的正确公式进行绘图,得到的图形正确、完美: 文档中给出来的推导公式也非常的简要明了。所以接下来只需要将文档中提及的公式好好学习、自行推导一遍,这一目的功课就应该算是完成了。 五、小节 1、其实上面的图形我完全可以在仿真软件里模拟出来,然后直接截屏就可以正常使用了。但是之所以纠结这个图形的产生过程,是因为我想搞清楚仿真软件中这个“电容电压跟随电源电压”的计算过程,究竟是怎样的; 2、如果不知道具体计算过程、不知道具体的推导过程,就很难理解为什么最终是RC的阻值、容值决定了它的相移。也无法自己利用SageMath绘制图形。不能自己绘制图形,就很难在博客文章或者“视频文章”中给出更详细的展现; 3、如今已经有了这个具体的“绘图公式”,我就可以按照自己之前的想法,绘制一系列的曲线,通过这些曲线说明为什么每一个RC网络可以实现(0°-90°)之间的相移、为什么必须需要至少3组RC网络才能形成180°的相移; 4、额外的,除了可以说明三组RC网络形成的180°相移外,还可以计算出最终反馈回去的电压有多少,与控制极的初始电压叠加之后形成的控制极电压波动有多大、进而推算出控制极的电流形成的开关效应,最终将Jack Kilby的RC Phase…

电容电压跟随电源电压的过程

一、问题的提出: 一颗有电且“满电”的电池,它的正极有着比负极更高的电势。 当将这颗“满电电池”的正负极通过导线连通时,通过电场力的作用,这条通路上的电子便会从低电势区域向高电势区域移动,目的是减小正负极之间的电势差,从而形成电子持续的定向移动,也就是电流。 因为这条导线是理想的、电池也是理想没有内阻的,所以电子的定向移动不会受到任何的阻碍,单位时间内通过导线横截面的电子数量可以无限多、电流无限大,只需近乎于0秒的时间,电池正负极的电势差就被拉成零、没有了电势差。 重新回到初始状态,在这条理想导线上加入一颗电阻,目的是阻碍电流的移动,使得导线上的电流不再是无限大,而是I=U/R,问:此种状态下,需要经过多少时间,电池的正负极电势差才能从U降低到0呢? 二、初步讨论 上面的问题中,一直用的是“电池”,目的是让问题更感性一些。其实这篇文章主要聊的是电容,因为电池和电容基本相似、可以类比,所以上面一直用“电池”来做表述。但电池和电容本质上是有差异的,所以为了更加严谨一些,下面不再使用“电池”的称呼,而是用“电容”来继续讨论。 一旦系统接通,电池(电容)将开始进行放电,电流经过电阻做工,并且逐渐的电容内部的电压会降低、直至电容电压降低到0。这也是上面提出来的问题:要经过多久的时间,电容电压才会从初始电压(例如5V),降低到0V呢?这里有一个值得注意的事情:电容初始电压虽然是5V、在系统导通的起始时刻,流经电阻(100Ω)的电流是I=5V/100Ω=50mA,但是这个电流并非恒定不变的。 随着时间的推移,电容内部的电场强度(如果是电池、则可以理解成电量)会越来越低、电容的端电压也会随之下降,从而导致流经电阻的电流也会越来越小。这个过程是连续的——每一个当前时刻的电流都是上一个时刻的电容电压决定的。在没有仔细的推敲之前,不妨先随手胡乱的画一画它们随时间t的变化关系: 如上的若干图形都是肆意画出来的,只有大概的猜测、并没有任何的理论依据。大方向上而言,电容电压随时间的推移一定是越来越低的,但究竟是上面图中哪一种形式呢?如果花更多一些时间思考,似乎能从“电能密度”的角度上猜测出,上面的3个曲线中,最右边的曲线似乎是更贴近于真实情况的。但也只是猜测。 另外,我们最关心的“经过了多长时间,电容电压变为0”,在上面的图形中也是无法推敲出来的。虽然我们知道这个时间一定非常小,所以图中都是“拍着脑袋决定”,在0.01s的时候,电容电压就已经降低到0V了,但实际情况究竟应该是怎样一个时刻?所以接下来就要从数学的角度具体推算一下了。 三、具体数学推导 电容放电过程中的电压变化,可以从两个维度上考虑,分别是KVL和KCL两个角度,也就是考虑电容上的电压时时刻刻等于电阻上的电压、或电容上流出的电流时时刻刻等于电阻上流过的电流。这两种思考角度本质上是一样的,具体的推到过程由下面的两个参考资料中可以详尽的看明白: 1、以电压考虑,依据Kirchhoff’s voltage law (KVL)进行推导: 参考资料:https://web.mit.edu/sahughes/www/8.022/lec09.pdf 2、以电流考虑,依据Kirchhoff’s current law (KCL)进行推导: 参考资料:https://mechatrofice.com/circuits/charging-capacitor-derivation 3、额外的,一篇不错的科普概述文章: 参考资料:https://courses.lumenlearning.com/suny-physics/chapter/21-6-dc-circuits-containing-resistors-and-capacitors/ 这里直接给出最终的结论,电容上的电压随时间T的关系式是: 由此看出电容电压在数学上是永远不会等于0的,它只会越来越趋近于0。但是现实世界中,因为电路上的IC并非理想的、并且存在着热扰动,所以只要经过一段时间,电容趋近于0的电压就会因为一个“小的波动”而抵达X轴,从而时电压归零。…

函数的图像

试使用SageMath进行函数图像的绘制。例如:对于复变函数 上面函数,可以使用SageMath绘制出在复平面上的图像: 其中的complex_plot()和plot()相似,只是声明为在复平面上进行绘图。后面的第一个(-5,5)指实坐标范围从-5到+5,第二个(-5,5)指的是虚数坐标、也就是复平面上的纵坐标、从-5i到+5i。 绘制出来的图像比较“抽象”,大概能看出来是通过彩色的衔接来表达是否连续,但这五颜六色的色彩对我而言还是比较陌生、一时难以理解的。 生成的图像是: 上面的图象太模糊了,改变参数,调整为plot_points=500,可以得到更清晰、精致的图像: