窗口拖动时应用程序卡住了

3

我试图监控一个外部资源(由我的程序读取的国家仪器采集系统生成的点),同时保持Gui响应。为此,我在每个监控循环周期中调用QCoreApplication::processEvents()当我用鼠标拖动主窗口时,循环会暂停直到我释放它,导致数据丢失。 我认为在任何需要在进程密集型循环中调用QCoreApplication::processEvents()以保持gui响应的情况下,都会出现这种行为。

有没有办法绕过这个问题,或者应该以其他方式实现监控循环?


1
数据采集需要进入单独的线程。 - Dan Mašek
1个回答

1
你应该拥有一个独立的GUI线程工作线程。每个Qt程序在启动时都有一个称为GUI线程的线程。Qt GUI必须在此线程中运行。工作线程用于将处理工作(在您的情况下是外部资源的监视)从主线程中卸载。
从链接中了解更多关于Qt线程基础知识的信息。

好的。我认为这可能是处理它的最佳方式。但是,这似乎很奇怪,因为其他事件不会挂起处理循环,只有窗口拖动/移动。即使我将监视放在另一个线程上,我预测窗口仍然会冻结“信息显示循环”,因为在我的程序中,获取的数据是实时显示的。 - A. Vieira
也许如果我重新实现move事件并在中间抛出_QCoreApplication :: processEvents()_。有什么线索吗? - A. Vieira
编辑:我能够创建子类,但它的工作方式与我想象的不同。 - A. Vieira
如果您对答案不满意,请在问题中添加相关代码。请注意,如果您按住小部件上的鼠标按钮,则该小部件会捕获鼠标事件,直到您释放按钮。按下鼠标而不释放它实际上等同于调用grabMouse(),即其他小部件根本不会收到鼠标事件。 - talamaki
谢谢talamaki的答复。我认为你理解了问题并给出了最相关的答案。虽然它透露出我可能没有做正确的事情,但我仍希望能够在窗口移动时保持更新GUI,甚至在另一个线程上进行监视任务。 - A. Vieira

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接