使用循环启动和停止 QThread



在QT应用程序中,我想在qthread内启动一个循环,该循环读取2种不同的声音(这是一个节拍器(。

我的流程有一个功能。我想在单击一个按钮时启动它,然后用另一个按钮停止它。

问题是,当我启动它时,我的应用程序没有响应,我无法单击停止按钮。我必须停止该应用程序。

#include <QSound>
#include <QEventLoop>
ClickThread::ClickThread(): highClickFile("://high_click.wav"), lowClickFile("://low_click.wav"), isRunning(false)
{
    this->highClick = new QSound(highClickFile);
    this->lowClick = new QSound(lowClickFile);
    this->setPeriod(120);
}
void ClickThread::run()
{   QTimer *timer = new QTimer();
    timer ->moveToThread(this);
    timer->connect(timer, SIGNAL(timeout()),this, SLOT(process()));
    timer ->start();
     exec();
}
void ClickThread::process(){
    highClick->play();
            QThread::msleep(period);
            highClick->stop();
            lowClick->play();
            QThread::msleep(period);
            lowClick->stop();
            lowClick->play();
            QThread::msleep(period);
            lowClick->stop();
            lowClick->play();
            QThread::msleep(period);
            lowClick->stop();
}
void ClickThread::setIsRunning(bool set)
{
    this->isRunning=set;
}
void ClickThread::setPeriod(unsigned long bpm)
{
    this->period = 60000/bpm;
}

感谢您的回答

停止使用 QTimer。

您当前拥有的 QTimer 默认为超时间隔 0。这将用对 process(( 的无限调用来填充事件队列,这将导致严重的问题。

你应该改用这个while循环:

stopPlaying = false;
while(stopPlaying == false)
{
    process(); 
} 

布尔值 stopPlay 变量应在 "ClickThread" 类定义中声明,并由停止按钮使用,以使线程退出循环,从而终止线程。

最新更新