@AflameGhost

Как сформировать массив в потоке, чтобы потом отобразить его на графике?

Долгое время уже сижу над программой в 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 туда записываются буквы.
Как быть?
  • Вопрос задан
  • 88 просмотров
Пригласить эксперта
Ответы на вопрос 1
Zifix
@Zifix Куратор тега Qt
Barbatum
Вы хоть одну статью, хотя бы на Хабре прочитали, как правильно многопоточку организовывать? Ваш код — это нечто заведомо неработоспособное, написанное наугад. Книжку хоть одну по Qt прочитали?

Например, вот это — лютая дичь, бесконечный цикл в UI потоке, из которого нет никакого выхода, очевидно, что оно зависает:
void MainWindow::on_pushButton_15_clicked() 
{
    ui->pushButton_15->setText("STOP");
    while (ui->pushButton_15->text()=="STOP"){
       spec_thrd->run();
    }
}
Возьмите заведомо рабочий пример, разберитесь, зачем нужна каждая конструкция, каждая строчка, и потом уже пошагово допиливайте его под себя.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы