创建服务器UDP套接字时,我使用bind绑定到地址
一段时间后我尝试重新绑定到不同的地址
抛出 QNativeSocketEngine::bind() 未在 QAbstractSocket::UnconnectedState 中调用
这是什么以及如何处理?
创建服务器UDP套接字时,我使用bind绑定到地址
一段时间后我尝试重新绑定到不同的地址
抛出 QNativeSocketEngine::bind() 未在 QAbstractSocket::UnconnectedState 中调用
这是什么以及如何处理?
从应用程序中,当调用一个方法时,会发出一个信号。线程对其进行处理并发出响应信号(在任意时间点)。我需要在执行此方法期间等待响应,而不是在附加到信号的插槽中。
如何在不“挂起”主线程的情况下等待来自应用程序主线程中的线程的信号到达?
我不擅长正则表达式......
帮助编写用于在字符串列表中搜索的正则表达式!
有一组线:
mbcli
port=ttyS0
parity=odd
找到以“port =”开头的行
试图写 ^port\=* 之类的东西 - 不起作用。
我生成一个正弦波
for(quint32 i = 0; i < ALen; ++i) ABuffer[i] = AAmplitude * qSin(i * M_2_PI * ASigFreq/ADiscrFreg);
使用 FFTW 库,我以复杂的形式获得了它的光谱
// подготовка плана преобразования
fftw_plan myPlan = fftw_plan_dft_r2c_1d(static_cast<int>(SampleCount), z, y, FFTW_ESTIMATE);
// расчет ДПФ
fftw_execute(myPlan);
其中 SampleCount 是样本数
z - 描述正弦曲线的数组
y - 结果数组
我得到了一系列真实形式的振幅
for (int i = 0; i < fftSampleCount; ++i) fftSamples[i] = sqrt(y[i][0] * y[i][0] + y[i][1] * y[i][1]);
我计算“峰值”及其在频谱中的位置
auto GarmAmplMax = std::max_element(fftSamples,(fftSamples+ADataLen));
auto GarmNum = std::distance(fftSamples,GarmAmplMax);
GarmAmplMax - 峰值幅度
GarmNum - 在 fftSamples 频谱中的位置
注意力!问题:如何计算所得峰值的频率?
整体功能代码
void MainWindow::on_actGetData_triggered()
{
ui->pbRecord->setEnabled(false);
// производим запись, а не генерацию звука
qint64 SampleCount;
double * x = nullptr;
double * z = nullptr;
QString WindowName;
auto getCoeff = [&](int i ) -> double
{
switch (FWindowIndex)
{
case 0 : // без окна
WindowName = "Без окна";
return 1;
case 1 : // Hann
WindowName = "Окно Ханна";
return 0.5*(1 - qCos((2 * M_PI * i)/(SampleCount-1)));
case 2 : // Gausse
{
WindowName = "Окно Гауса";
double a = (SampleCount-1)/2;
double t = (i - a)/(0.5 * a);
return qExp(-(t*t)/2);
};
case 3 : // Hamming
WindowName = "Окно Хэммнга";
return 0.54 - 0.46 * qCos((M_2_PI * i)/(SampleCount - 1));
}
return 0;
};
int devIndex = ui->cbDevice->currentIndex();
if(ui->cbDevice->currentIndex())
{
QAudioFormat format;
format.setSampleRate(ui->spbDescrFreq->value());
format.setChannelCount(1);
format.setSampleSize(16);
format.setCodec("audio/pcm");
format.setByteOrder(QAudioFormat::LittleEndian);
format.setSampleType(QAudioFormat::SignedInt);
QList<QAudioDeviceInfo> list = QAudioDeviceInfo::availableDevices(QAudio::AudioInput);
QAudioDeviceInfo info = list.at(devIndex - 1);
if(!info.isFormatSupported(format))
{
addMessage("Заданный формат записи не поддерживается");
ui->pbRecord->setEnabled(true);
return;
};
FRecorder = new QAudioInput(info,format, this);
FBuffer->open(QIODevice::ReadWrite);
FRecorder->start(FBuffer);
addMessage("Запись запущена.");
QTest::qWait(ui->spbDuration->value());
addMessage("Запись окончена. Начата обработка данных.");
SampleCount = (*FBuffer).size()/2;
qint16 * SamplesList = reinterpret_cast<qint16 *>((*FBuffer).buffer().data());
addMessage(QString("Сделано %1 отсчетов").arg(SampleCount));
x = new double [SampleCount];
z = new double [SampleCount];
// накладываем окно
for (int i = 0; i < SampleCount; ++i)
{
x[i] = SamplesList[i];
z[i] = getCoeff(i) * x[i];
}
FBuffer->buffer().clear();
delete FRecorder;
FRecorder = nullptr;
}
else // генерация звука
{ // секунды частота
SampleCount = (ui->spbDuration->value()/1000) * ui->spbDescrFreq->value();
addMessage("Начата генерация данных.");
x = new double [SampleCount];
z = new double [SampleCount];
generateSinWav(x, // приемник данных
SampleCount, // количество отсчетов
ui->spbDescrFreq->value(), // частота дискретизации
ui->spdSignalFreq->value(), // частота синусоиды
20000); // амплитуда сигнала
for (int i = 0; i < SampleCount; ++i)
{
z[i] = getCoeff(i) * x[i];
//addMessage(QString("x[%1] = %2").arg(i).arg(x[i]));
}
addMessage("Данные сгенерированы. Начата их обработка");
}
qint64 fftSampleCount = SampleCount / 2 + 1;
fftw_complex * y = new fftw_complex[fftSampleCount];
// подготовка плана преобразования
fftw_plan myPlan = fftw_plan_dft_r2c_1d(static_cast<int>(SampleCount), z, y, FFTW_ESTIMATE);
// расчет ДПФ
fftw_execute(myPlan);
fftw_destroy_plan(myPlan);
double * fftSamples = new double[fftSampleCount];
for (int i = 0; i < fftSampleCount; ++i) fftSamples[i] = sqrt(y[i][0] * y[i][0] + y[i][1] * y[i][1]); //получаем модуль комплексного числа - амплитуду сигнала
addMessage("обработка закончена");
ChartForm * Form = new ChartForm;
Form->setAttribute(Qt::WA_DeleteOnClose, true);
Form->showSourceSignalChart(x,SampleCount,ui->spdSignalFreq->value());
Form->showSignalChart(z,SampleCount,WindowName);
Form->showSpectrChart(fftSamples,fftSampleCount,ui->spbDescrFreq->value());
Form->show();
if(fftSamples) delete [] fftSamples;
if(z) delete [] z;
if(y) delete [] y;
if(x) delete [] x;
ui->pbRecord->setEnabled(true);
}
有一个worker包含一个数据数组。
它实现了一个在线程中执行的run-method并处理数组(如何不重要)。与worker的通信通过信号槽发生。
有一个插槽可以在线程运行时更改数组(如何 - 没关系)。
所以,问题是:是否有必要在此插槽中使用互斥锁数组来包装工作并运行?
或者调用slot的过程中不需要同步?
在 moveToThread 之后,插槽将在什么情况下工作?
有
# define QT_USE_NAMESPACE
# define QT_BEGIN_NAMESPACE
# define QT_END_NAMESPACE
标题就像
QT_BEGIN_NAMESPACE
class QVBoxLayout;
QT_END_NAMESPACE
这些定义的深层含义是什么?
这些不是宏。他们需要什么?
有一类
class LoaderToTextEdit : public QObject, public ILoader {
Q_OBJECT
public:
explicit LoaderToTextEdit(QTextEdit & ATextEdit, QObject *parent = Q_NULLPTR);
LoaderToTextEdit(const LoaderToTextEdit & ALogger);
const LoaderToTextEdit & operator =(const LoaderToTextEdit & ALogger);
virtual ~LoaderToTextEdit();
virtual void sendMessage(ILoader::MessageType AMesgType,const QString & AMessage);
private slots:
void onTimer();
private:
QMutex * FMutex;
QTextEdit * FTextEdit;
QQueue<QString> * FLoggerQueue;
QTimer * FLoggerTimer;
void initTimer();
};
cpp中有构造函数和析构函数的实现。编译错误:
对“LoaderToTextEdit 的 vtable”的未定义引用
关于构造函数和析构函数。
帮助我理解!
我正在尝试使用, swearsQByteArray
获取指向数据的指针:data()
ошибка: invalid conversion from 'const char*' to 'char*' [-fpermissive] char * TempPtrBuff = ARes.data();
文档说返回char *
.
为什么会出现错误?
是否可以重载这样的一对运算符:[]=
. 那些。通过索引访问内部字段并向其写入值。