c++ - QT如何在主程序中等待一个线程(不使用睡眠/冻结)
问题描述
我的 QT 程序在一个循环中有 4 个步骤:
- 读取 n 配置文件
- 通过 UART 向 uC 传输值
- 录制音频文件并从 uC 接收值
- 停止录制和写入标题(*.PCM 到 *.WAV 转换)
- 转到 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 的功能
我认为最大的问题 - 我尝试将正常的代码循环与信号槽原理结合起来!?也许我必须将我的代码分成不同的部分并制作一个插槽 - 如果一个部分结束了,我必须去下一个插槽?这是一个正确的逻辑?
解决方案
推荐阅读
- kubernetes - RabbitMQ - 消息已发布,但未路由
- mysql - 使用 dotnet ef 命令生成的迁移 SQL 脚本文件对 Azure MySQL DB 无效
- flutter - 重试显示位置 | 谷歌地图颤振
- ios - 奇怪的键盘崩溃:-[UIKeyboardSliceTransitionView rebuildSliceTransitions] + 1832 (UIKeyboardSliceTransitionView.m:592),仅限 iPad
- node.js - nodejs 动态导入失败但文件存在(不是无扩展名问题)
- javascript - 为什么即使在定义之后也会出现 setstate 错误?
- qt - Qt Designer,信号到帧及其元素
- node.js - 401未经授权的雅虎金融
- azure - Power BI SaaS 连接到 Azure SQL IaaS
- android - Steam Android 应用无法通过链接打开 Steam 游戏页面