最近一直比较忙,没有时间来更新文档记录,今天正好抽个时间来记录点东西。毕竟年龄大了,有些东西仅仅靠脑子,记不住,即使记住也是暂时的。
今天更新的东西比较多,主要是有两部分内容,第一部分是新版本的CTK 插件框架主程序退出出现的bug以及该bug的解决。第二部分,采用老版本的CTK(CTK-2018-10-29)插件框架的使用记录。
1.上一篇,我们用win10系统 + vs2019 + qt5.15.2编译了ctk的库,我的使用是:mainWindow 主窗口是作为一个插件来实现的,main函数仅仅是启动插件,这样就带来了一个bug。bug描述如下:就是在程序退出的时候崩溃,显示的是qt5guid.dll 中引发的异常:0xC0000005:读取位置0xFFFFFFFFFFFFFFFF时发生访问冲突,跟踪了并行堆栈,发现也就一个主线程,没其他的线程,具体问题见下面截图:
在main()函数return ret,ret的值为0,直接return 0;报的错误是一样的。
这个问题,我也了解了下,使用过的CTK的同行,都遇到这个问题,问题依然是没有解决。尴尬,问题的原因,能力有限,我也没搞清楚,我们继续往下看吧。查看并行堆栈,发现都找不到对应的pdb文件,这个时候,可以去qt的官网,下载对应的pdb文件,我这里给出网址(已vs2019 x64位版本为例,其他版本应该是一样的,),免得大家再去折腾:
下载以下两个文件:
1) 5.15.2-0-202011130602qtbase-Windows-Windows_10-MSVC2019-Windows-Windows_10-X86_64-debug-symbols
2) 5.15.2-0-202011130602qttools-Windows-Windows_10-MSVC2019-Windows-Windows_10-X86_64-debug-symbols
然后解压到指定的目录下,我这里是解压到了qt的安装路径下了,如下图:
然后到vs的菜单栏-- 工具 -- 选项--调试--符号,添加上述下载的两个文件解压后的目录:
添加完毕后,在启动调试程序, 并行堆栈的显示如下图所示:
这是出现的问题,猜测,可能是CTK的版本更新后,用法有所改动。这个问题(针对目前github上master新版本,其他版本没有测试),我们可以采用另外的一种方式来去避免。 还是要参考CTK给的官方例子 ctkPluginGenerator项目。查看ctkPluginGeneratorMain.cpp源代码;如下图:
它的主窗口程序是放到了exe中,而不是像我放到plugin中。按照这个思路,在我们的测试代码中新建一个继承QMainWindow窗口类,注意一定是QMainWindow窗口类,而不能是QWidget或QDialog窗口类,非QMainWindow窗口类,报的错误跟上述描述的问题一样。我们来看下效果。
ok,这样我们就可以正常的使用ctk的插件的相关功能了。有点遗憾的是:上述出现的问题,我依然没有解决,希望有懂的大佬,帮忙解决下这个问题。
如果主窗口在插件中实现的话,就会方便很多,可以通过事件来通知主窗口程序的显示、隐藏、退出。因为我的程序可能会通过网络通讯的方式(网络通讯是写到另外一个插件中的)来通知主窗口的显示、隐藏以及退出等,网络通讯的功能,我这里采用了另外一种思路:在主程序中,启动定时器,定时的去扫描变量是否变化来实现主窗口的显示、隐藏以及退出功能的。
2.到github上下载CTK,这时候需要选择tag标签页下的2018-10-29版本,如下图所示:
下载后,编译环境同样采用window10 + qt5.15.2 + vs2019 64位,具体的编译可参考链接:
新的启程系列-CTK编译(windows 10 + vs2019 + qt5.15.2)_hong_yu0315的博客-CSDN博客
用cmake-gui工具时,会出现很多的警告,如下图所示,我们可暂且忽略警告,直接点击“generate”,然后打开vs2019 编译CTK插件库。
我们将上面的测试代码移植到CTK-2018-10-29里面(我这里为了两个版本都进行测试,其实可以改变测试的链接头文件和库文件即可)。
然后采用同样的代码来测试。测试的结果如下:
运行效果如下:
直接关闭mainWindow窗口,这个mainWindow是一个插件,我们来看下vs2019的输出窗口,
我们可以看到,老版本的CTK程序是可以正常退出的。
从上面可以看出,CTK新老版本在使用上是有些区别的。这可根据大家的功能需求去选择到底是采用哪个版本。就我个人而言,可能老版本更合适写,新增加的功能,我貌似也用不到。嘎嘎,好了,今天就到这里,有疑问可以跟我联系。可能回复不是很及时,见谅!