通过循环启动和停止QThread

时间:2019-06-16 23:41:31

标签: qt loops 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;
}

感谢您的回答

1 个答案:

答案 0 :(得分:1)

使用QTimer停止。

您当前使用的QTimer默认超时间隔为0。这将使对process()的无限调用塞满事件队列,这将导致严重的问题。

您应该改用while循环:

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

应该在“ ClickThread”类定义中声明boolean stopPlaying变量,并由停止按钮使用该变量,以使线程退出循环,从而终止线程。