It does not create a chart
-
wrote on 11 Jan 2021, 18:21 last edited by
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.
-
wrote on 11 Jan 2021, 18:26 last edited by
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.
-
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.
wrote on 11 Jan 2021, 18:30 last edited by@SGaist can i connect them, or what can i do for this problem? I read and write in mythread.cpp
If i move initChartView and timer_slot, is it true? -
@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.
-
@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.
wrote on 11 Jan 2021, 19:01 last edited by@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.
-
wrote on 11 Jan 2021, 20:44 last edited by
@SGaist can you show me an example? I did not understand
-
What did you not understand ?
-
wrote on 11 Jan 2021, 21:02 last edited by
@SGaist if my slot is my queue, what should be the signal. I didnt understand it.
-
Your slot is not your queue. Did you read the chapter about signals and slots ?
-
Your slot is not your queue. Did you read the chapter about signals and slots ?
wrote on 12 Jan 2021, 05:45 last edited by@SGaist yes i did. But i cannot understand how can i get datas
-
@SGaist yes i did. But i cannot understand how can i get datas
@suslucoder What exactly can't you understand? In the documentation @SGaist posted there is even an example with signal/slot with parameter...
3/14