Долгое время уже сижу над программой в Qt, основанной на работе с потоками, и никак не удается разобраться.
Есть основное окно MainWindow.
MainWindow.cpp#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "spectrumthread.h"
#include <QDebug>
#include <QFile>
#include <QFileDialog>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
spec_thrd = new spectrumthread(this);
spec_thrd->data(mw);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::data(MainWindow *w)
{
mw = w;
mw->show();
}
void MainWindow::on_pushButton_15_clicked()
{
ui->pushButton_15->setText("STOP");
while (ui->pushButton_15->text()=="STOP"){
spec_thrd->run();
}
}
void MainWindow::graph(QByteArray par)
{
qDebug()<<par;
}
Необходимо, чтобы по нажатию на кнопку начинал выполняться поток в стороннем классе
spectrumthread
до тех пор, пока кнопка снова не будет нажата.
spectrumthread.cpp#include "spectrumthread.h"
#include "qapplication.h"
#include "math.h"
#include <QDebug>
spectrumthread::spectrumthread(QObject *o)
: QThread()
{
obj_receiver = o;
delta_dbm = 0.0;
for(int i = 0; i < N_RES; i++) spec[i] = 0.0;
}
void spectrumthread::stop()
{
stopped = true;
}
void spectrumthread::data(MainWindow *mw)
{
m = mw;
}
void spectrumthread::run()
{
Spectr1 param;
long unsigned int data;
double re, im, k;
int i, j;
stopped = false;
while(!stopped)
{
do
{
data = 2044;
data--;
}
while(!(data & 1));
for(i=0; i<(N_RES/8); i++)
{
for(j=0; j<8; j++)
{
re = qrand();
im = qrand();
k = sqrt(re*re+im*im);
if(k > 0)
{
k = 20*log10(k);
}
else
{
k = 0;
}
spec[i*8+j] = k + delta_dbm;
param.word[i*8+j]=spec[i*8+j];
}
}
stopped = true;
}
m->graph(param.word);
}
Результатом выполнения потока будет массив
QByteArray
, который отправляется обратно в
MainWindow
в метод graph.
Но вот в чем проблема: после первого нажатия кнопки поток отрабатывает только один раз, после чего программа зависает, кроме того, несмотря на то, что в массиве spec образуются числа, после присвоения его элементам word туда записываются буквы.
Как быть?