如何使用按钮停止具有睡眠定时器的 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();
}