implemented working multithreading
This commit is contained in:
71
graphics.cpp
71
graphics.cpp
@ -110,8 +110,8 @@ void Graphics::plot(Mandelbrotc const &m)
|
||||
// }
|
||||
// }
|
||||
|
||||
for (uint32_t i = 0; i < m.screen.size(); i+=2) {
|
||||
for (uint32_t j = 0; j < m.screen[0].size(); j+=2) {
|
||||
for (uint32_t i = 0; i < m.s.x; i++) {
|
||||
for (uint32_t j = 0; j < m.s.y; j++) {
|
||||
uint8_t color = 255 - (m.screen[i][j]*255/m.max_iter);
|
||||
SDL_SetRenderDrawColor(this->renderer, color, color, color, 255);
|
||||
SDL_RenderDrawPoint(renderer, (int)i, (int)j);
|
||||
@ -128,10 +128,13 @@ void Graphics::mainLoop()
|
||||
this->from = Vec2mp(fx, fy);
|
||||
this->to = Vec2mp(tx, ty);
|
||||
|
||||
bool mouseDown = false;
|
||||
Vec2i m_start = Vec2i(0, 0);
|
||||
Vec2i m_end = Vec2i(0, 0);
|
||||
|
||||
Mandelbrotc m = Mandelbrotc(from, to, Vec2i(this->w, this->h), 100);
|
||||
m.thread_count = 5;
|
||||
m.start_threads();
|
||||
m.thread_count = 16;
|
||||
m.start_threads(true);
|
||||
|
||||
while (this->running)
|
||||
{
|
||||
@ -160,21 +163,67 @@ void Graphics::mainLoop()
|
||||
this->to.y += 0.2;
|
||||
}
|
||||
break;
|
||||
case SDL_MOUSEBUTTONDOWN:
|
||||
if (mouseDown)
|
||||
break;
|
||||
mouseDown = true;
|
||||
m_start.x = event.button.x;
|
||||
m_start.y = event.button.y;
|
||||
break;
|
||||
case SDL_MOUSEBUTTONUP:
|
||||
mouseDown = false;
|
||||
break;
|
||||
case SDL_MOUSEMOTION:
|
||||
m_end.x = event.motion.x;
|
||||
m_end.y = event.motion.y;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
std::cout << "mainloop range " << this->from.x << std::endl;
|
||||
std::cout << "mainloop range " << this->from.y << std::endl;
|
||||
std::cout << "mainloop range " << this->to.x << std::endl;
|
||||
std::cout << "mainloop range " << this->to.y << std::endl;
|
||||
//this->plot(this->from, this->to);
|
||||
|
||||
if (mouseDown) {
|
||||
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
|
||||
if (m_start.x < m_end.x) {
|
||||
for (int i = m_start.x; i < m_end.x; i++) {
|
||||
SDL_RenderDrawPoint(renderer, i, m_start.y);
|
||||
SDL_RenderDrawPoint(renderer, i, m_end.y);
|
||||
}
|
||||
} else {
|
||||
for (int i = m_end.x; i < m_start.x; i++) {
|
||||
SDL_RenderDrawPoint(renderer, i, m_start.y);
|
||||
SDL_RenderDrawPoint(renderer, i, m_end.y);
|
||||
}
|
||||
}
|
||||
if (m_start.y < m_end.y) {
|
||||
for (int i = m_start.y; i < m_end.y; i++) {
|
||||
SDL_RenderDrawPoint(renderer, m_start.x, i);
|
||||
SDL_RenderDrawPoint(renderer, m_end.x, i);
|
||||
}
|
||||
} else {
|
||||
for (int i = m_end.y; i < m_start.y; i++) {
|
||||
SDL_RenderDrawPoint(renderer, m_start.x, i);
|
||||
SDL_RenderDrawPoint(renderer, m_end.x, i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
std::cout << "done" << std::endl;
|
||||
// std::cout << "mainloop range " << this->from.x << std::endl;
|
||||
// std::cout << "mainloop range " << this->from.y << std::endl;
|
||||
// std::cout << "mainloop range " << this->to.x << std::endl;
|
||||
// std::cout << "mainloop range " << this->to.y << std::endl;
|
||||
|
||||
m.start_threads(false);
|
||||
this->plot(m);
|
||||
m.stop_threads();
|
||||
|
||||
// std::cout << "done" << std::endl;
|
||||
|
||||
SDL_RenderPresent(renderer);
|
||||
SDL_SetRenderDrawColor(this->renderer, 255, 255, 255, 255);
|
||||
SDL_RenderClear(renderer);
|
||||
|
||||
SDL_Delay(100);
|
||||
if (m.done)
|
||||
exit(1);
|
||||
}
|
||||
m.stop_threads();
|
||||
}
|
||||
|
Reference in New Issue
Block a user