首页 > 解决方案 > QT如何在主程序中等待一个线程(不使用睡眠/冻结)

问题描述

我的 QT 程序在一个循环中有 4 个步骤:

  1. 读取 n 配置文件
  2. 通过 UART 向 uC 传输值
  3. 录制音频文件并从 uC 接收值
  4. 停止录制和写入标题(*.PCM 到 *.WAV 转换)
  5. 转到 n+1 配置文件并从第 1 步重新开始。

对于我正在使用的录音:

m_file.open(QIODevice::WriteOnly); //audio access mode initialisation
writeHeader(); //writing header to convert PCM to *.wav
m_audio->start(&m_file); //start recording
QTimer::singleShot((record_time_sec+4)*1000), this, SLOT(StopRecording()));

QTimer::singleShot() 打开一个新线程,同时录制(第 3 步)正在工作 - 主程序仍在运行,我看到该程序尝试直接执行循环中的下一步而不等待停止录制。

如何等待记录线程结束然后执行后续步骤?

PS我正在阅读QCoreApplication::processEvents()但我不确定如何使用该功能!?


void Measure::processMeas(){

    // Declaration xxxxxxx
    // Read config files 
    QDir directory("tralala");
    QStringList config_files = directory.entryList(QStringList() << "*.txt", QDir::Files);
    config_files_cnt = config_files.count();

    foreach(QString filename, config_files) { //config loop
        Conf *conf = new Conf(directory.absoluteFilePath(filename));
        qDebug() << "Config file: " << filename << " is processed";

    // Error message xxxxxxxx
    // Prepare measure 
        qDebug()<<"Debug: Prepare measure";

        QStringList lines = conf->getConf_lines(); //read all rows of config files

        record_time_100ms = lines.count();
        record_time_sec = record_time_100ms / 10;

        for(i=0; i < (uint32_t)lines.length(); i++){ //prepare single rows of config files

            QString uart;
            QString uart_hex;

                if(i > 5 && i < lines.length()){
                QStringList speed_chunks = lines.at(i).split(","); //split rows by decimal point

                m1 = speed_chunks.at(2).toInt();
                m2 = speed_chunks.at(3).toInt();
                m3 = speed_chunks.at(4).toInt();
                m4 = speed_chunks.at(5).toInt();

                hextest.resize(10);
                hextest[0]=255;
                hextest[1]=m1>>8;
                hextest[2]=m1;
                hextest[3]=m2>>8;
                hextest[4]=m2;
                hextest[5]=m3>>8;
                hextest[6]=m3;
                hextest[7]=m4>>8;
                hextest[8]=m4;
                hextest[9]=238;

                qDebug()<< "Transfer data: " << i << " from " << lines.count()-1 << " rows transmitted";

                m_serial.write(hextest);
                m_serial.waitForBytesWritten(1000);
                QThread::usleep(50000);

                }//if(lines.at(i).contains(",")) end
            }//for end

    // Measurement 
            if(stm==0){
                QString path = SAVE_AUDIO_PATH+QDateTime::currentDateTime().toString("yyyyMMdd_hhmmss");
                m_file.setFileName(path+".log");
                m_audio->StartRecording(path+".wav");
                stm=1;
            }
            qDebug()<<"Measurement takes " << record_time_sec+4 << " seconds";
    // Stop measure 
           measure_cnt++;
           // All configs files done 
            if(measure_cnt>=config_files_cnt){
                //m_timer->stop();
                qDebug()<<"All measure done";
                // qApp->quit();
            }
        }//foreach



}
*************************************************
void Audio::StartRecording(QString rec_file_path)
{
    m_file.setFileName(rec_file_path); //audio recording path format
    m_file.open(QIODevice::WriteOnly); //audio access mode initialisation

    writeHeader(); //writing header to convert PCM to *.wav (Step 1)

    m_audio->start(&m_file); //start recording

    QTimer::singleShot((15000), this, SLOT(StopRecording()));
}

//Stop recording

void Audio::StopRecording()
{
    m_audio->stop();
    writeHeaderFinal();
    m_file.close();
}

写头();和 writeFinalHeader(); 只是将 PCM 转换为 *.Wav 的功能

我认为最大的问题 - 我尝试将正常的代码循环与信号槽原理结合起来!?也许我必须将我的代码分成不同的部分并制作一个插槽 - 如果一个部分结束了,我必须去下一个插槽?这是一个正确的逻辑?

标签: c++qt

解决方案


推荐阅读