C++ Qt中定时器的正确使用

C++ Qt中定时器的正确使用,c++,qt,qt5,C++,Qt,Qt5,我想编写一个可以用于训练的间隔计时器。因此,必须有一个堆栈小部件,用户可以输入训练的时间,剩余的几轮和重复,然后按下开始按钮,改变页面并开始显示的第一轮倒计时 因此,如果用户输入20秒用于训练,10秒用于休息,3次重复数字 20比0、10比0、20比0、10比0和20比0 应该一个接一个地显示 我遇到的问题是: 我尝试了QTimer和一个QThread,该QThread具有1秒睡眠功能和gui的信号槽,但在这两个选项中,gui都冻结了。我认为您以一种非常复杂的方式设计了解决方案。没有代码就不可能

我想编写一个可以用于训练的间隔计时器。因此,必须有一个堆栈小部件,用户可以输入训练的时间,剩余的几轮和重复,然后按下开始按钮,改变页面并开始显示的第一轮倒计时

因此,如果用户输入20秒用于训练,10秒用于休息,3次重复数字 20比0、10比0、20比0、10比0和20比0 应该一个接一个地显示

我遇到的问题是:


我尝试了QTimer和一个QThread,该QThread具有1秒睡眠功能和gui的信号槽,但在这两个选项中,gui都冻结了。

我认为您以一种非常复杂的方式设计了解决方案。没有代码就不可能告诉你出了什么问题。 如果我必须为此开发一个解决方案,它将以互连块的形式出现,可以是延迟块或流控制块块父块的子类。 每个块都有一个下一个块和一个触发函数。延迟块也有一个时间。流量控制块可以具有不同的功能,例如仅针对x次重复指向前一块。当触发新延迟块时,可以使用全局QTimer来触发下一个块。将计时器的超时信号连接到下一个块的触发功能,然后使用当前块的时间启动计时器

例如,如果你想做3次30秒的练习,10秒的休息,你可以用一个重复块连接两个延迟块。

使用QTimer不会阻塞主窗口。这就是计时器的用途

此外,您根本不需要使用线程,只需以所需的时间间隔启动计时器(例如,每10毫秒一次),然后将超时信号连接到将处理应用程序行为的插槽。 在此插槽中,您只需处理倒计时和状态更改工作时间到中断时间(如果未达到重复次数)、中断时间到工作时间和完成状态

我已经创建了这样一个应用程序,它运行良好。也许我以后会在github上提供它。如果我这样做,我会对我的答案进行编辑以提供链接


希望有帮助。

你的主要目标是什么?为什么需要使用线程?也许你使用的方法是错误的,但不幸的是,我们不知道,因为你没有指出它。从我所看到的一个错误是whilemytime->count>=0{},您不应该使用消耗大量时间>=10ms的循环。在您的情况下,我们不知道该循环会阻止吉他显示每一轮的压缩。这是必要的,因为如果你在主窗口中有一个计时器,它会阻止一切。我想给你另一种方法,但我不理解你潜在的问题。花时间>=30分钟改进你的问题,写得更好,并详细解释。阅读你不需要任何线程。你有一个问题,关于线程,你有两个问题,并且随着每个线程的增长而增长。很简单。忘掉QThread,忘掉sleep。我是认真的:忘记这些存在。现在想一想如何解决这个问题:@KubaOber你的评论听起来好像我的暗示没有那么糟糕@该示例使用QTime获取当前挂钟时间,并使用QTimer强制定期更新。这和你想要达到的目标不一样吗?