我正在开发一个关于数据采样和实时显示的项目,如示波器。数据以高传输速率传输到具有虚拟COM端口的PC。我正在使用QT4.8.4 + Qextserialport在WindowsXP上完成串口通信。
我使用AccessPort测试了设备。它可以从端口接收数据,但没有响应写入它。如果我想让设备停止上传数据,我必须停止设备并向其发出停止命令,重新启动设备,然后设备停止上传。使用一个线程处理读写的应用程序也是如此。我不想完全关闭端口。我只是想输入一些命令来改变一些东西,采样率,数据格式等。
所以,我尝试了多线程。我从以下链接下载了参考代码。 http://www.qtcentre.org/threads/21063-QextSerialPort-with-QTimer-approch-for-reading?p=103325&highlight=#post103325 (对不起,我真的不知道如何在这个网站上粘贴代码)
在这段代码中,作者派生了两个QThread的子类。一个用于读取端口,另一个用于写入端口。他还在这两个子类中重新实现了run()。我尝试了这段代码,但发现在接收代码时,我的GUI被冻结了。
似乎以下主题中的作者与我遇到了同样的问题。 Qt: GUI sometimes freezing when using threads and signals/slots
但我对这个帖子有疑问。
当GUI线程中的所有代码时,作者是否意味着一切正常?那么,为什么他使用工作线程和进程线程?
我是否需要另一个进程线程来处理负责显示的GUI线程?(我不仅需要显示数据而且还要显示波形,所有这些都必须实时显示)
请给我一些如何解决这个问题的技巧。非常感谢。
答案 0 :(得分:0)
简短的回答是肯定的。在GUI线程上执行任何繁重的处理将导致冻结GUI(特别是如果您阻止)。相反,您应该拥有一个更新数据的独立线程,或者为特定任务分离工作线程。在任何一种情况下,当有新数据显示时,您应该在有新数据显示时发出GUI线程的信号。如果可能的话,我建议使用MVC模式并实现一个QAbstractItemModel来为您的视图提供数据(因为它有一个定义的模式来提供这些更新)。