Failed to activate OpenGL context: The handle is invalid.Hello,
I try to make my simple Chart class for C++ with SFML. The idea is to make simple windows for charts, each in different thread so to not affect the main program.
The problem is that the opened windows must be closed in reverse order - from the last opened to the first. Else the upper error message displays in the console. Seems that the program works, but this message worry me.
I am not C++ developer, so preliminary thank you for any help!
My source is:
MChart.hpp
#pragma once
#include <SFML/Graphics.hpp>
#include <string>
class MChart
{
public:
MChart(const unsigned int width = 500, const unsigned int height = 500,
const std::string xlabel = "", const std::string ylabel = "", const std::string title = "");
~MChart();
void set_data_len(unsigned int N);
void append_data(float x, float y);
void update_data(unsigned int i, float x, float y);
private:
static unsigned int fig_num;
const unsigned int border{10};
unsigned int width, height;
const std::string xlabel, ylabel, title;
unsigned int fig_num_c;
sf::Thread th;
bool MustToStop{false};
bool Stopped{false};
sf::VertexArray graph{sf::LinesStrip};
sf::VertexArray box_grid{sf::Lines};
void run_dis();
};
MChart.cpp
#include <string>
#include <iostream>
#include <SFML/Graphics.hpp>
#include "MChart.hpp"
unsigned int MChart::fig_num{1};
MChart::MChart(const unsigned int width, const unsigned int height,
const std::string xlabel, const std::string ylabel, const std::string title) :
width{width}, height{height}, xlabel{xlabel}, ylabel{ylabel}, title{title},
th{&MChart::run_dis, this}
// the list of initializers is initialized in declaration order in *.hpp file (see -Wreorder)
{
this->fig_num_c = MChart::fig_num++;
this->th.launch();
}
MChart::~MChart()
{
this->MustToStop = true;
while (!this->Stopped)
;
}
void MChart::run_dis()
{
// Initialize window
sf::ContextSettings settings;
settings.antialiasingLevel = 8;
sf::RenderWindow window{sf::VideoMode(this->width, this->height),
std::to_string(this->fig_num_c), sf::Style::Close, settings};
window.setVerticalSyncEnabled(true);
// Draw window
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if ((event.type == sf::Event::Closed) ||
((event.type == sf::Event::KeyPressed) &&
(event.key.code == sf::Keyboard::Escape)))
window.close();
}
if (this->MustToStop)
window.close();
window.clear(sf::Color(0, 5, 55));
window.draw(this->graph);
window.draw(this->box_grid);
window.display();
}
this->Stopped = true;
}
void MChart::set_data_len(unsigned int N)
{
this->graph.resize(N);
}
void MChart::append_data(float x, float y)
{
this->graph.append(sf::Vertex(sf::Vector2f(x, y), sf::Color::Yellow));
}
void MChart::update_data(unsigned int i, float x, float y)
{
if (i < this->graph.getVertexCount())
graph[i].position = sf::Vector2f(x, y);
}
main.cpp
#include "MChart.hpp"
int main()
{
MChart ch1, ch2;
for (int i = 0; i < 300; i++)
{
ch1.append_data(i, i);
ch2.append_data(i, i / 2);
}
system("pause");
return 0;
}