It does not create a chart
-
I have 2 different threads. In thread one reading data from txt and in thread 2 copy that file into another txt. I want to create a chart via thread 2(which is writingData() ). I have the following code. But there is no chart when i run the code. I have also mythread.h and myhread.cpp
mainwindow.cpp
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QtCore> #include <QMainWindow> #include <QtWidgets/QMainWindow> #include <QtCharts> #include <QChart> QT_CHARTS_USE_NAMESPACE using namespace QtCharts; MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); initChartView(); connect(m_timer, SIGNAL(timeout()), SLOT(Timer_Slot())); m_timer->setInterval(500); m_timer->start(); myThreadObject = new mythread(); myQThread = new QThread(); myThreadObject->moveToThread(myQThread); connect(this, &MainWindow::startWriting, myThreadObject, &mythread::writeData); connect(myThreadObject, &mythread::writingDone, this, &MainWindow::writingDoneByThread); // Start the new thread myQThread->start(); } void MainWindow::writingDoneByThread() { } MainWindow::~MainWindow() { delete ui; } void MainWindow::initChartView() { QChart *chart = new QChart(); chart->ChartTypeCartesian; chart->addSeries(series); qDebug()<< series; QPen green(Qt::red); green.setWidth(2); series->setPen(green); chart->legend()->hide(); chart->setTitle("deneme"); chart->setAnimationOptions(QChart::AllAnimations); QValueAxis *axisX=new QValueAxis; axisX->setTickCount(10); axisX->setRange(0,5); axisX->applyNiceNumbers(); chart->addAxis(axisX, Qt::AlignBottom); series->attachAxis(axisX); QValueAxis *axisY = new QValueAxis; axisY->setTickCount(10); axisY->setRange(0, 5); axisY->applyNiceNumbers(); chart->addAxis(axisY, Qt::AlignLeft); series->attachAxis(axisY); QChartView *chartView = new QChartView(chart); chartView->setRenderHint(QPainter::Antialiasing); this->setCentralWidget(chartView); } void MainWindow::Timer_Slot() { static float q_x; if(!queue.isEmpty()) { double num=queue.dequeue(); q_x += 0.1; series->append(q_x, num); chart->update(); } }
mainwindow.h
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include "mythread.h" #include <QMainWindow> #include <QThread> #include <QtCharts/QChartView> #include <QtCharts/QLineSeries> #include <QtCharts/QLogValueAxis> #include <QtCharts/QValueAxis> #include <QTimer> QT_CHARTS_USE_NAMESPACE QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = Q_NULLPTR); ~MainWindow(); void initChartView(); void Timer_Slot(); private: Ui::MainWindow *ui; mythread* myThreadObject; //mythreadden yeni bir obje yaratıyorum QThread* myQThread; //QThreadden bir obje yaratıyorum QChart *chart = new QChart(); QLineSeries *series = new QLineSeries(); QQueue<double> queue; QTimer *m_timer = new QTimer(); signals: void startWriting(); public slots: void writingDoneByThread(); }; #endif // MAINWINDOW_H
-
Hi,
Your queue is empty because nothing fills it.
-
In here I thought I was adding the datas into the queue
void mythread::writeData() { QFile::copy("C:/Users/ilknu/Documents/MyThread/deneme.txt", "C:/Users/ilknu/Documents/MyThread/n.txt"); QFile file2("C:/Users/ilknu/Documents/MyThread/n.txt"); qDebug() << "im working in writeData part " ; if(file2.open(QIODevice::ReadOnly)) { QTextStream in(&file2); while(!in.atEnd()) { QString line2 = in.readAll(); QStringList list2 = line2.split(QLatin1Char(' '), Qt::SkipEmptyParts); for(const QString &entry : list2) { double num = entry.toDouble(); queue.enqueue(num); qDebug() << num; } } } file.close(); emit writingDone(); }
-
That queue variable belongs to your mythread class. It's not the same as the one from your MainWindow class even if it has the same name.
-
@suslucoder said in It does not create a chart:
If i move initChartView and timer_slot, is it true?
It won't change anything as these two variables will still be unrelated.
@suslucoder said in It does not create a chart:
can i connect them, or what can i do for this problem? I read and write in mythread.cpp
You have to get the data from your mythread object back to your MainWindow.
As I already suggested, you really should start with C++ basics before playing with threading.
-
@SGaist said in It does not create a chart:
You have to get the data from your mythread object back to your MainWindow.
What is the way for getting datas from mythread to my mainwindow? I would be very happy if you could show me the way
-
Use a signal to transfer the queue. Make it a const reference.
-
What did you not understand ?
-
Your slot is not your queue. Did you read the chapter about signals and slots ?
-
@suslucoder What exactly can't you understand? In the documentation @SGaist posted there is even an example with signal/slot with parameter...