在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;
}
感谢您的回答
答案 0 :(得分:1)
使用QTimer停止。
您当前使用的QTimer默认超时间隔为0。这将使对process()的无限调用塞满事件队列,这将导致严重的问题。
您应该改用while循环:
stopPlaying = false;
while(stopPlaying == false)
{
process();
}
应该在“ ClickThread”类定义中声明boolean stopPlaying变量,并由停止按钮使用该变量,以使线程退出循环,从而终止线程。