如何使用按钮停止具有睡眠定时器的 while 循环? (Qt C++)
How to use a button to stop a while loop that has a sleep timer? (Qt c++)
我想先声明一下我是编程新手。所以答案可能很明显,或者我可能做错了什么;请随时(礼貌地)指出这一点。我总是很高兴学习并变得更好!
我正在尝试使用 while 循环创建和发送测试数据。 while 循环有一个睡眠定时器,因此数据每秒只发送一次。我希望停止按钮立即停止发送数据(并禁用按钮),但由于睡眠定时器的原因,单击按钮和执行功能之间存在延迟。
这是我的资料:
void DlgTestData::on_btnStart_clicked()
{
ui->btnStart->setEnabled(false);
ui->btnStop->setEnabled(true);
m_bSendingData = true;
while ( m_bSendingData )
{
CreateAndSendTestData(); //Only sends a single message
QThread::sleep(1`enter code here`)
}
}
void DlgTestData::on_btnStop_clicked()
{
m_bSendingData = false;
ui->btnStart->setEnabled(true);
ui->btnStop->setEnabled(false);
}
使用 QTimer 而不是睡眠。这样它就可以在任何时候停止,并且它不会阻止您的应用程序在等待时想要做的其他事情。
使 QTimer 成为您 class 的成员指针:
class DlgTestData
{
...
private:
QTimer *m_timer;
};
然后在构造函数中初始化:
DlgTestData::DlgTestData()
{
...
// Create, but don't start the timer
m_Timer = new QTimer(this);
connect(m_timer, &QTimer::timeout, this, &DlgTestData::CreateAndSendTestData);
}
按下开始按钮后,只需启动计时器即可。
void DlgTestData::on_btnStart_clicked()
{
...
m_timer->start(1000);
}
然后当按下停止按钮时,只需停止计时器即可。
void DlgTestData::on_btnStop_clicked()
{
...
m_timer.stop();
}
我想先声明一下我是编程新手。所以答案可能很明显,或者我可能做错了什么;请随时(礼貌地)指出这一点。我总是很高兴学习并变得更好!
我正在尝试使用 while 循环创建和发送测试数据。 while 循环有一个睡眠定时器,因此数据每秒只发送一次。我希望停止按钮立即停止发送数据(并禁用按钮),但由于睡眠定时器的原因,单击按钮和执行功能之间存在延迟。
这是我的资料:
void DlgTestData::on_btnStart_clicked()
{
ui->btnStart->setEnabled(false);
ui->btnStop->setEnabled(true);
m_bSendingData = true;
while ( m_bSendingData )
{
CreateAndSendTestData(); //Only sends a single message
QThread::sleep(1`enter code here`)
}
}
void DlgTestData::on_btnStop_clicked()
{
m_bSendingData = false;
ui->btnStart->setEnabled(true);
ui->btnStop->setEnabled(false);
}
使用 QTimer 而不是睡眠。这样它就可以在任何时候停止,并且它不会阻止您的应用程序在等待时想要做的其他事情。
使 QTimer 成为您 class 的成员指针:
class DlgTestData
{
...
private:
QTimer *m_timer;
};
然后在构造函数中初始化:
DlgTestData::DlgTestData()
{
...
// Create, but don't start the timer
m_Timer = new QTimer(this);
connect(m_timer, &QTimer::timeout, this, &DlgTestData::CreateAndSendTestData);
}
按下开始按钮后,只需启动计时器即可。
void DlgTestData::on_btnStart_clicked()
{
...
m_timer->start(1000);
}
然后当按下停止按钮时,只需停止计时器即可。
void DlgTestData::on_btnStop_clicked()
{
...
m_timer.stop();
}