wxWidgets似乎没有事件广播机制

wxWidgets的任意object产生了事件之后,似乎只能向父层传递,并且“一路向上”的往上传递。既不能向下传递、也不能横向传递。换言之,wxWidgets的事件是不能进行“广播”的。虽然没有通读过所有关于wxWidgets的文档,但是感觉上面的结论应该是准确的。

如果将整个窗口及上面所有的组件看做一颗“树”,任意节点上产生的事件,在“不能广播”的前提下,唯有这个节点的“父亲”是唯一的。

如果这个事件可以“向下传递”,那么任意节点下面的子节点有可能是多个,向下传递意味着就是“广播给所有的子节点”。

同理,如果能够横向传递,必然是先从当前节点向上传递给父节点,再由父节点广播给所有子节点,才能令兄弟节点收到消息。或者换一种想法,任意节点的兄弟节点也可能是多个,所以“横向传递”意味着有多个兄弟节点等待接收事件,由成了广播机制。

所以“没有广播能力”就意味着不能向子节点和兄弟节点发送事件。反之:不能向子节点发送通知就是在说不能进行广播。两种表述是一样的,就是不能只依靠事件对项目进行彻底的解耦开发。

没有广播机制,程序的解耦程度会大打折扣。我现在就遇到了好几处问题。总要迂回着完成事件的传递、或由“中间人”帮忙进行控制的操纵,代码写的凌乱不说、更重要的是这样“千回百转的羊肠小路”做控制的纽带,总担心日后会忘记它们之间的联系。

另一方面,这条“羊肠小径”无论多么的纵曲幽深,都一定不能中断。但是对于复杂的窗口应用程序、尤其是还在不断调整的开发阶段,页面上的控件总会不断地调整、新建、删除,不断的做出重新规划,每一次规划都要想着其中不知有多少“羊肠小径”需要连带着调整。既痛苦、又易出错。

虽然现在我用了一个全局单例来缓解问题,令代码可以尽可能的解耦;也缓解了组件的迁移需要不断调整众多“羊肠小径”的尴尬,但终归觉得还是不完美。此时此刻,这个痛苦的问题,着实令我有些疲倦。

以前上学的时候觉得所有的知识都挺容易理解的,现在也许是年龄大了,即便是对已经已经熟练掌握了的知识,再看的时候,都会感觉是“一头雾水”,唯有继续艰难的、一点点的重新理解,才能让自己感觉有所收获。

Related Posts

激光测距方面又学习了一些知识

在《激光测距方面的文章及帖子备忘》这篇文章中,只是初步的对激光测距的脉络和框架有个初步的了解,这两天继续阅读相关的文章,有了更多的一些认知。激光测距如果是通过借助“光反时间”进行距离计算的话,那么这个“光反时间”t就是要被测量的数值。根据测量方法不同,有dtof法和itof法两种。从其名称上不难看出,dtof方法就是直接测量光返时间,而itof法则是间接的测量。 直接测量光反时间,原理并不复杂,甚至是很容易理解的,而且电路也相对简单,它还有更大的优点:可以测量远距离、超远距离,只要激光强度足够就可以。这一测量方法唯一的难点就是如何精准的计时:激光脉冲发出的时刻开始计时、回光信号收到的时刻结束计时。这个时间段要被精准的抓取并记录下来,可以说被测物体距离越远,相对而言得到回光时间就约容易。 然而也是因为它记录的Δt有可能存在较大的误差,因而测量结果的波动性也会比较大。同样的距离,测量5次,也许每次之间的距离误差能高达3-5米。不过dtof法更多的应用场景是几百米~数十千米的范围,因而有个几米的误差尚能接受罢。 另外一种方法就是itof间接测量,是通过调制信号在回波中的相移推算出Δt,这里的相移相当于是对测量结果进行了一次“细分”,如果分辨率是1°、也就是对结果进行了360分的细分;如果分辨率是0.1°,则意味着是对测量结果进行了3600分的细分。因而相对于直观测量法而言,itof间接测量法可以天然的令测量结果精度提升几百倍,轻松从“米”的测量精神,提升至“厘米”、甚至是“毫米”的测量精度。 然而itof测量依靠的是调制信号的频率,而这个调制信号又属于高频信号,因而在电子电路中,面对高频信号的时候,会因为要面对不在设计时体现出的各种串扰问题、现场应用场景下的各种串扰问题,而无法得到理想的波形和信号、或者说噪声问题会变得严峻,因而虽然它的测量结果更优异、理论虽然复杂但理论测量方案更简便,但在实际操作的时候反而会变得更加难以设计和实现。 另一方面,间接测量法的整个“测量系统”中存在的功能单元要比直接测量法多,拍着脑袋说,如果直接测量法整个电路功能单元有4个,那么间接测量法要实现的电路功能单元可能就要有10~15个左右。依然是因为串扰、信号干扰问题,在如此众多的电路功能模块中,任何一个模块产生的污染,都有可能导致整个系统失真。所以对于间接测量法,要将整个系统中各个功能模块联动起来、平衡好每一个模块的耐受程度、对外产生的污染量,是一个不小的挑战。 除此之外,间接测量法,我个人觉得暂且就没有其它障碍或难度了。所以接下来,我想花一些时间对这个工具的具体实现进行学习,看看是否能够在经过一段时间的学习和尝试之后,有个阶段性的收获吧。

激光测距方面的文章及帖子备忘

一、整体方法脉络 这里有人提问:个人是否有可能设计、制作出来一套激光测距模块。下面的回复内容基本都是非常乐观的回复,认为这个模块已经比较大、可以称为一个“功能系统”了,然而即便是系统级的电路模块,其中每一个功能单元还是清晰、没有太大技术障碍,因而可以乐观的认为个人是有可能实现出来的。 原文地址:https://www.reddit.com/r/Optics/comments/1jg8z7f/possibility_of_building_my_own_modulated_laser/ 这里应该是个人制作的激光测距仪的具体文章,其中包含了两个十分有价值的电路图,可供参考。 原文地址:https://sudonull.com/post/114996-Homemade-Phase-Laser-Rangefinder 二、调制信号的生成 有了上面的“宏观概览”之后,大概能够勾勒出一个整体框架:激光二极管发出一个调制光线、光敏二极管接收光线。然后只要在光敏二极管后面,能够同时将发出的调制信号和接收到的调制信号进行比较,就可以实现相位比较了。 其中调制信号是一个高频正弦波,可以利用SI5351生成。关于SI5351的资料如下: https://cdn-learn.adafruit.com/downloads/pdf/adafruit-si5351-clock-generator-breakout.pdf https://github.com/adafruit/Adafruit-Si5351A-Clock-Generator-Breakout-PCB https://github.com/adafruit/Adafruit-Si5351A-Clock-Generator-with-STEMMA-QT-PCB 上面第一个链接是adafruit出品的SI5351模块的使用手册,下面两个链接则是这款产品的开源制造资料。可以看到这个“调制信号发生器”的制作并不难,而且这个模块暂时也没有必要自己制作,网上有现成的,回头有时间了,买一个回来试用一下。

使用MT3608进行升压备忘

一、备忘与准备 MT3608是一颗SOT-23-6封装的DCDC升压芯片,这个封装尺寸对我而言非常小、不易进行焊接操作。当完成升压电路的学习和尝试之后,也许会再寻找其它芯片替换当前的芯片以方便后期的焊装操作(PS:最近几天一直在关注更大尺寸的IC,但直到此刻,还没有找到比SOT-23-6更大封装的类似芯片)。 因为MT3608的封装实在小、在表面上并没有Pin1的标记,而是默认从顶面看下去时,丝印文字的左下角(Lower Left)是Pin1,并且按照逆时针完成其余脚位的定义。 它的输入电压可以是2V-24V,输出最大可以提升到28V的输出电压。 我当前的需求是:输入电压是3.7-4.4V之间(锂电池供电)、或者是5V(通过带有初级升压的电源管理芯片供电),而输出电压需要通过配置电阻实现5V-12V的输出、以便通过输出电压的调整实现对蜂鸣器音量的控制。 这个需求看上去利用MT3608是可以实现的,按照它的技术手册推荐的电路设计方案,将5引脚输入上述的3.7V-5V电压,然后通过引脚4的使能信号决定芯片是否工作:如果引脚4使能低电平,则芯片不工作,这个时候输出电压将与输入电压相同;如果引脚4使能,则芯片工作,按照配置电阻完成升压给定,输出就是目标电压了。 但是这个推荐方案和我的需求是不一样的:我期望的是输出或者有电压、或者没有电压,原因是如果MT3608工作输出一个预期的电压、蜂鸣器是工作的;但是当MT3608不工作时,输出电压虽然没有升压、但依然与输入电压相同,此时蜂鸣器将一直在工作。所以我期望的是MT3608不工作、不升压时,输出电压也完全没有。因而我的电路结构如下: 输入引脚4和使能引脚5同时与电压源连接,当电压源存在时,则芯片工作、输出预期的电压;当电压源不存在时自然也就没有输出电压了。 接下来将按照上面的思路,将电路搭建起来,完成这个测试。 二、初步搭建出来的电路有问题 2025年4月11日下午,完成了上面电路的搭建,但是并不顺利:最终结果是得不到预期的升压效果。 1、起初完成电路的搭建之后,输出电压十分混乱:或者是没有输出电压、或者就是输出电压和输入电压几乎相同;在输出电压几乎和输入电压几乎相同时,消耗的电流却十分巨大、高达上百毫安——经过反复的尝试也没有找到明确的原因,最终我将原因假定在使用的面包板质量太差、存在内部缺陷。直接扔掉、更换了一个新的面包板; 2、更换完新的面包板之后依然只能得到与输入电压一样的输出电压,这意味着芯片并没有进行工作,通过使用示波器也发现芯片的确没有起振、工作。但是偶然发现如果将输入电压设置在6V以上时,芯片是可以开始工作的,但是输出电压的建立需要大约1-2秒才能完成; 3、上面的第2个问题原因是我没有引入C1和C2两处的电容:当初以为这两个地方的电容只是稳波用的,实际上C2的输出电容更主要的目的是建立输出电压;而C1处的电容是稳定输入电压以确保芯片能够正常工作,所以这两处的电容不能忽略。在C1处引入3颗10uF的电容并联、在C2处同样引入3颗10uF的电容并联,芯片大概就能正常工作了; 4、在完成了上面第3点的调整之后,芯片的确可以正常工作了:给入5V的电压,输出大约是10V;给如3.7V的电压,输出大约是6V;给入8V的电压,输出大约是15V。但是这个表现与MT3608应该具备的表现是完全不一样的:MT3608应该是通过R1和R2配置电阻的设置,得到一个不随输入电压变化的输出电压,例如我设定R1=20K、R2=1K,此时的输出电压应该一直稳定在12.6V,而实际上我的输出电压却一直是与输入电压相关的; 5、更离谱的是:输出电压带不动负载,即便只接入一个很轻的负载,输出电压也会立刻掉下去、掉到与输入电压一样; 6、上面的第4、5两点,昨晚想到今天,感觉最可能的是我使用的二极管选型存在着问题:我使用的是1N5819,这颗二极管的反向恢复时间(Trr)大约是75-150ns,因为它的Trr在肖特基二极管中属于较慢的,所以它适合于500kHz以下的工作频率;而对于MT3608这种高频开关芯片,反向恢复时间过长意味着倒灌发生的多、也就无法有效的建立起能量输出了。所以如果插件1N5822(Trr=35-50ns);如果贴片SK34或SS34(Trr=25-35ns)应该是更适合的; 7、基于上面第6点,所以又购买了SK34二极管,用于将现在使用的1N5819替换下来,看下是否能够将第4、5两个问题解决掉(现在感觉猜测方向应该靠谱,大概率能够解决问题)。 三、二极管还在运送途中 2025年4月14日晚6:40。上面的故障现象和可能的原因我怀疑是在自己使用的1N5819二极管的关断时间太长,所以无法有效的完成能量输出和电压建立,所以便又重新网购了一些SK34二极管,这些新网购的二极管现在还在路上。 同时,因为自己手中也没有合适的电容,之前只能用一些小容量的电容并联搭建电路,所以又网购了10uF和22uF的电容,这些电容今天已经到了,但是因为SK34还没有到手,所以也不急着测试。 在购买上面的IC时,我实在是有些不放心——也说不定自己对MT3608的理解不对呢?所以我便又购买了两块成品DCDC电路,这两块电路一来可以对比观察一下别人做出来的效果;二来万一自己搭建的电路还是无法工作,也可以有个参考的机会。这两块现成的DCDC今天也已经送到了,所以一会儿如果精力体力够用,就先测试一下这两块现成的DCDC电路板的效果。 我要测试的其实很简单:就是看一下输出电压是否能够稳定、带上负载之后是否依然有效。 四、问题越搞越不明朗 1、成品升压芯片的配置电阻不理解:这个成品的电路图看上去应该是和我使用的电路图完全一样的(大概率是一样的),但是它的R1=17K、R2=2K时,得到的输出电压并不是预期的5.1V,而是9V,这是什么原因呢? 2、成品输出电压是9V时,输入电压无论怎么改变,例如输入电压无论是3V、5V还是7V,输出都是9V,这是符合预期的。但是当我将SS34放到自己的电路中之后,依然无法得到恒定的输出电压,输出电压始终是输入电压的两倍。所以我还要继续替换自己电路中的IC,现在想着电容先不替换,而是将电感改成与成品一致的试一下;…

微信小程序開發備忘

小程序開發已經用三脚貓功夫做了一些粗略的實現,接下來就是學習這個技術框架中的細節,并且返工之前粗略、粗糙的地方。今天學習了一下幾個技術技巧: 一、子控件向父控件發送帶參數事件消息 頁面上的button按鈕是我做的一個子控件、這個按鈕是放在panel控件中的。現在我想點擊button按鈕的時候,button按鈕完成響應、并將事件通知給panel,由panel接收並繼續處理事件。 此前的實現非常拙劣,就是只使用panel進行事件的處理: 這樣做的壞處是顯然的:觸摸會發生在整個panel中。而我希望的是觸摸僅由裏面的button受理。改造過程如下: 1、首先panel的頁面層,調整代碼如下: 這樣調整之後,panel不再接受bind:tap消息,而是會接收名爲customEvent的事件,一旦接收到customEvent事件,則進行running執行。此時的customEvent事件將由button發出,所以button的代碼寫成下面的形式: 這樣只要點擊了button,就會運行sendEvent方法,這個方法内實現向父層發出消息的過程,具體js代碼是: 通過triggerEvent發出了一個customEvent事件,父控件因爲綁定了這個事件、接收到並開始處理就可以了。 二、動態成員訪問的方法 類似如下的PHP代碼: 在JavaScript中的實現方式是: 三、控件數據初始化 微信小程序的components控件,似乎沒有(我不確定)如pages頁面那樣的onLoad()方法,儅加載了一個小控件之後,向這個控件中傳入一些初始變量,便沒有辦法找到一個Init()或onLoad()的地方,對這些傳進來的變量進行預處理、以被在頁面上使用。 此時可以使用控件的observers監聽服務,對傳遞進來的變量進行監控,一旦傳遞進來的變量生效,observers服務啓動,以便進行數據的預處理操作。具體代碼如下: 四、頁面中的if/else流控方式 此前頁面中一直是這麽寫: 現在有了更好的方法: 雖然在頁面上的if/else流控寫法我已經瞭解了,但感覺并不如C/C++那樣直觀,總感覺有些奇怪,擔心它的嵌套不準確。不過也不重要,總之今天掌握的,就是這些。

《普林斯顿微积分》第8章学习备忘

这一章很简短,只有2个话题:如何进行隐函数求导、隐函数求导能够完成相关变化率的求解。这两个话题看的我是“一头雾水”,全都能够看懂、给出的例题也都会做,但其中的细节是没有一点儿能搞清楚的,总结就是这一章看的是“似懂非懂”。 一、隐函数求导: 1、什么是隐函数?这就是摆在我面前的第一个困惑,《普》几乎是很快就引入了隐函数求导的方法,而没有说明什么是“隐函数”,它是否是个更基础的、无需多说的知识呢?不得而知; 2、隐函数求导的具体过程。这一点对应着书中的§8.1,不费力气就看明白了。我在阅读这个章节的时候,对“链式求导法则”有了更豁然的理解,这个“豁然”要趁着现在还没有忘记、尽快花时间详细记录一下。否则一旦过段时间,很可能又会忘记掉; 3、具体的隐函数求导例题。没有什么难度,书中给出的例题都能跟着做出来。但诚如上面提到的,因为我不知道什么是“隐函数”,所以例题能做出来是没有意义的,原因在于:如果放在陌生的问题中,我可能很难一眼看出“这是一个隐函数”、“这里应该用隐函数求导去解决问题”; 4、隐函数求二阶导。同样的也可以将例题做出来,但是这里也存在着一个问题:我不理解二阶导的微分符号中,它的“分子”和“分母”中的上标位置区别的具体含义,或者说二阶导的上标符号具体是什么含义我不清楚。虽然能够隐约感觉到答案,但并不明确,所以这里也要再额外花时间推敲一下,形如下面的二阶导微分公式中,上标“2”的位置和具体含义: 二、相关变化率 1、§8.2章节是《相关变化率》的现实应用,以及利用隐函数求导方法求解。能知道说的是什么事情、能完成书中的例题的求解。 2、但是这些例题我自己却不会构建。不会自己构建例题说明自己完全不理解什么是“相关变化率”,不会自己构建例题意味着现实中即便遇到了“相关变化率”的问题或现象,也很难认识他们,知道他们,看得清他们,联想到使用隐函数求导的方式去解决他们; 3、相关变化率的具体概念要再花时间了解、学习。直到自己能够构建出例题、不费力气的就能信口举出例子、自己能够构建出应用场景和应用例题,才算是了解了这个话题。我现在能想到的比较感性的生活场景是人的吃饭、排泄,以及与体重的关系。这样一个生动的例子,如果能够随心所欲的构建出各类例子,并通过隐函数求导解决,应该就算是了解了。 三、小结 1、如上,就是这一章节的学习心得。可见这一章当前只是囫囵吞枣地阅读了、了解了,并不理解; 2、接下来将继续阅读第九章:指数函数和对数函数。

《普林斯顿微积分读本》阅读备忘(2)

一、前六章学习小结 已经将第六章看完了,现在开始阅读第7章的内容。前六章的内容实际上讲解的非常缓慢,都是在介绍什么是极限、什么是导数、什么是微分。我阅读、理解的更慢,断断续续好几个月才看完。却至今还是没有十分明白。 什么是极限? 极限是指某一个函数如,当自变量趋近于某一个定点时,这个函数的结果、也就是因变量将会趋近于的结果。极限是一个明确的结果、是一个明确的数值、是一个明确的“结果数值”。 什么是导数? 导数和上面的极限不同,相对于“极限”而言,导数并不是一个明确的结果数值,而是因变量的变化量与自变量的变化量的比值,也就是当在某一个明确的点(如)上时,的比值。所以它是“比值”、而非“数值”。 什么是微分? 微分是我仍然不理解的概念,上学时不理解、如今重学微分课程还是不理解。微分似乎既不像是上面的数值、也不像是上面的比值,微分什么都不是,微分只是一个“求导的过程”、“求导的方法”、“求导的思想”。微分是一种“细分思想”,利用这种“细分思想”或“微分思想”完成求导的思维方式。 同时,微分还是一个“符号”,使用“导数符号”表示的是比值结果,使用微分符号表现的是求出”比值“之前的”心路历程“。而且使用微分符号因为能够更多的展现出”求导的心路历程和动机目的“,所以在更复杂的求导过程中,利用微分符号可以更明确的将计算细节展现出来,进而使用各种”微分技巧“进行化简、转换、运算,以完成最终的求导、得到想要得出的比值来。 大概就是上面这个印象。也许还要再多花一些时间继续学习,才能有更透彻的理解。 二、额外的与模电联想 在模电中也经常会提到“微分电路”和“积分电路”,这里的两个名词具体含义也整理一下,也许过几天会用到。 微分电路:电路的输出信号与输入信号的导数成正比。换言之,微分电路输出的是输入信号的变化率。 积分电路:输出信号与输入信号的积分成正比。换言之,积分电路输出的是输入信号的累计值。 三、开始学习第七章的内容 接下来的第7章还是进一步对极限、导数、微分进行更多的例题讲解。只不过其中的例题都不再是多项式函数,而是三角函数。 大概翻看了一下后面的章节目录,后面的不同章节中,仍然是对极限、导数、微分进行更多的例题讲解,和第7章的大概方向是一样的,唯有不同的是,后面章节分别再对指数函数、对数函数、双曲函数……等进行求导、微分。 之所以简单的“极限、导数、微分”要如此一轮又一轮的重复,我猜也许是有如下2个原因: 1、不同的函数类型,微分思想虽然都是一样的,但用到的技巧各不相同,所以要区分讲解,从而不断地引入各种新的微分技巧或定理; 2、不同的工科应用领域中,用到的函数不同,例如在计算机行业中,也许就会经常用到三角函数、但很少用到双曲函数,所以不同专业的人可以有取舍的仅对自己行业频繁用到的函数类型进行微分思想练习。 如上是当前的学习小结。