一、记一次不是很理想的Debug
这次改bug改的我心力憔悴,本以为是很简单的功能,结果改了整整两天,因为担心错过现场的问题急得晚上觉都没睡好,最后也才改了几行代码,陶工也看了半天,不过好在最后妥协解决了问题。
先说问题:
在教师端中,口译模块(或者说所有的后开发的模块,除了英语天地和语文乐园)中,在不开启广播的前提下,开启师生对讲会失效,而且在对讲的中途开关广播可能会出问题,而现场又要的很急,所以这里只能根据需要进行一系列的修改。
1.最初的设想
最开始我会错了意,以为就是直接在打开语音对讲的时候打开语音广播并禁用广播按钮,但是实际上并不是这么操作的,因为界面上其实有很多种可能的操作进入师生对讲状态,并不是只有按下师生对讲的时候才会进入到对讲状态,所以在按下按钮这里操作,是不可取的,也就是说会有明显的bug。这里浪费了很多时间,这其实是相当不应该的。
2.修改
意识到问题之后,需要将发送指令的地方提前到启动师生对讲的具体的地方去。为什么要这么做?前面说了,界面上有很多种可能的操作可以进入师生对讲状态,而且入口不一,没有一个统一的入口可以进入到这个里面去。所以只能添加到最底层,也就是NetInterop.cpp中的StartTalk()函数中去,所有的启动师生对讲的操作最后的都会走回到这里,这里是主框架的指令。
其实所有的指令最后都会走到主框架里面来,最后所有网络相关的指令也全都在NetInterop里面,这个真的是不实践不知道,之前也没人给我讲过,自己实践一下才明白个大概是什么意思。
现在修改成了:
师生对讲时,保存语音广播状态,然后点击语音广播按钮,锁定语音广播按钮,退出语音广播时,按钮恢复到之前状态。
修改如下:
1.在发起对讲通话的地方,调用FrameChanging指令向各个窗体发送特定的消息码,比如我这里发送的就是SeatZone SIP_StartTalk
这个是最底层的实现了,也就是整个主框架发送语音对讲的地方。
包括StopTalk的位置,也需要写入响应的消息码事件,以供其他模块接收。需要注意的是,这个消息码一经发出,是所有模块都会接收到的消息,这也是为什么后续这个问题这么难修改的原因之一。
2.在指定模块上加入接受指令的命令
注意我们这里修改的是所有新模块的课堂讲解,也就是类似于这个界面
其实整个主框架在更新过程中有很多类似但是不相同的界面,需要注意,这也就是为什么我们这里会出问题。
如果只是这样,就可以愉快地在
这个地方添加上几行(想象一下这里原先有一个寻找当前状态的方法,curVoiceBroadcast = this->GetItemChecked(“VoiceBroadcast”)),本来问题到此就结束了,但是事情并没有那么简单,虽然大部分模块的问题解决了,但是有一个比较老的模块还是出了问题,那就是自习辅导模块。
自习辅导模块是一个比较老的模块,上面的内容还是很久以前的MFC好像,调用的地方和LBD_English有点不一样,是直接在这个MainForm.cpp里
于是我们就也可以在这个MainForm中的FrameChanging函数中添加上一个接收消息的指令(原先也有保存当前广播状态的方法)
但是这样显然是不行的,为什么呢?因为这个FrameChanging广播消息,其实是直接发送到所有窗体里面去的,如果我们在这里也加一个对FrameChanging的监听,当发送对讲消息SIP_StartTalk的时候,其实在上面那个模块也启动了状态,而且因为没有界面的关系,LBD_English中的按钮的状态是随机的(不一定,但肯定是和MainForm中的状态是对不上的),就导致了一系列的bug,而一开始我和陶工两个人都没搞明白为什么会发生这个bug,是第二天的下午才发现的。
3.最后的修改
最后的话,修改方案只能做一些妥协,那就是当关闭语音对讲的时候,直接打开广播,而此时不再考虑之前的广播状态了,避免状态对不齐的情况,代码最后就成了上述图片的样子。
其实很简单,两天时间改了几行代码,过程却相当曲折,哎,吃一堑长一智吧。
二、如何在主框架中修改,添加自己的软件
1.首先要确定自己的软件是要加入哪个模块:
当然了,我们这个软件根据ui图,是加在 英语天地 和 语文乐园里
那么我直接就在这两个模块里面加这个模块就行了