Запустите и остановите QThread с помощью цикла - PullRequest
0 голосов
/ 17 июня 2019

В приложении 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 Ответ

1 голос
/ 17 июня 2019

Прекратить использование QTimer.

QTimer, который у вас есть в настоящее время, по умолчанию имеет интервал тайм-аута 0. Это заполнит очередь событий бесконечными вызовами process (), что вызовет серьезные проблемы.

Вместо этого вы должны использовать цикл while:

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

Логическая переменная stopPlaying должна быть объявлена ​​в вашем определении класса "ClickThread" и использоваться вашей кнопкой остановки, чтобы заставить поток выпадать из цикла, завершая поток.

...