一、遇到问题
今天在对软件进行测试开发时,为了解决软件在运行视频显示和串口接发过程中的卡顿问题,创建了两个子线程来运行两个功能。
在使用moveToThread()函数将串口功能添加进新线程并编译运行时,出现了如下图所示的问题:
这个问题的意思是在connect时无法对“QTextCursor”类型的参数进行排队,除此之外并没有其他的错误提示信息,也没有打印具体的错误位置。
二、查找原因
从该语句中我并未发现任何问题,于是便查找网上相关问题的资料,得知该问题出现大概率是因为在子线程中调用了主线程中窗口类的控件函数,于是又回去查看了一下connect语句中的槽函数serialRecv(),发现确实在这个函数中调用了主窗口控件QTextBrowser::append()。
查看了网上一些博主给出的解释,大概意思就是QT不能在子线程中对主窗口进行界面更新的操作。在多线程并发运行过程中,如果不同线程同时更新UI的话会导致程序出现错误,这是不安全的,于是程序便会异常退出,所以最好就是只在一个线程中进行UI界面更新,也就是窗口的主线程。
三、解决方案
基于上述原因,解决该问题的方法就是不在子线程中调用UI控件,转而通过QT的信号槽来实现不同进程间的数据传输,也就是通过自定义信号和槽函数,再用connect在线程间建立连接。
建立完之后,再次编译运行,串口能够正常进行数据接发,同时视频不会出现卡顿现象。