- 起因
- 原本是想学习asio中的tcp回显,却意外在示例程序集中看到了chat。编译成功后觉得在命令行中使用没意思,而且因为服务器的消息转发并未忽略发送者,所以在终端会同时显示两条一模一样的消息,感觉有些别扭。虽然前期有修改一份不对发送者转发的服务端副本来解决消息重复的问题,但仍旧有一种添加界面的冲动。
- 问题(未解决)
- 虽然程序由Windows端编写并提交,但却是在Ubuntu开始着手的,所以没有选择Windows下的GUI框架,而是使用了在上课时老师提到的GTK框架。由于初次接触,很多方面不熟悉,只能现学现卖,依靠神奇的百度(谷歌虽好,但舍不得fangqiangruanjian的花费)完善代码,所以结构很是杂乱。如若某位仁兄对代码结构有什么好的建议,可以发issue留下意见,或者您觉得代码实在写的太烂的,也可以在issue区骂我,我也不介意。
- 问题(已解决)
- Windows的GTK+开发环境配置废了一些时间。最开始,为了使用强大的VS进行开发,特意从搜索结果中采用了能够与VS集成的vcpkg,但是由于图标问题,最终的界面窗口图标全部缺失。因此,我考虑转向MINGW。有趣的是,原本因为多次配置VS CODE失败而对找一个能够对接MINGW的IDE的我,因为在教室瞥了一眼同学的电脑桌面,瞬间想起还有Code::blocks可以用。所以最终的配置是:Code::blocks+msys2(gtk官方推荐使用msys2,因为其携带的pacman管理器可以很方便的下载gtk包以及依赖,而且官网的安装向导还有现成的命令行提供)。
- 首次编译不出意外地失败了,以为没有为code::blocks配置gtk+环境,Windows版的CB可以在”项目——>属性“页面最后的库中直接选择,因为它已经为我们引入了pkg-config能够识别的所有包。只是很遗憾Linux版的CB没有自动引入pkg-config,而我的项目最终是要转移回Ubuntu的,所以最后是在构建选项的“编译器其他选项”和“连接器其他选项”中添加了pkg-config字段。
- 开始阶段程序无论如何都无法运行成功,后来将窗口的show函数和gtk_main()扔到另一个线程之后程序才勉强开始运行。后来发现,gtk_main()与ioc.run()分别属于UI和IO的事件循环的启动点,调用后将以阻塞的方式监控事件,并通过异步回调处理事件。因此,两个事件循环需要存在于两个线程中。
- 当我脱离CB,尝试直接双击可执行文件运行程序时,发生了错误,“无法定位程序输入点inflateReset2于动态链接库libpng16-16.dll” ,最终在一篇两年前的CSDN博客末尾发现了问题源头:由于libpng16-16.dll依赖另一个动态链接库zlib1.dll,而我的环境变量路径中还有其它同名文件,而且由于库版本不同,导致定位失败,最终将mingw64/bin对应的路径提到环境变量首位,使得程序能够第一时间命中正确的库,确保了程序的正确运行。
- 后期
- 修改message结构以及解包机制,增加用户名与时间戳,让chat看上去更像一个聊天程序,而不仅仅是tcp回显的扩充。
- 由于本人想要学习CMake,需要一个试手的项目,项目构建工具由Code::Blocks改为VSCode+CMake。
- 由于种种原因,将GUI框架从GTK+换成了其在C++中的接口GTKMM,由于更改后新的事件循环体系与GTK+的区别较大,造成了很大的阻碍。最主要的是,GTKMM在网络上的学习资料太少了。
- 内容修改:
- 以条件循环模拟线程阻塞,完成了登录期信息检测,期间io_context的使用产生了一些阻碍。
- 将显示recv_msgs的文本框放置在滚动窗口中,解决了当消息过多时,窗口变形的问题。
- 最后,message结构修改尚未开工,表示抱歉。
剩下的等我哪天心情好再继续写......