I have a method that inits my program state and to speed up the whole process I'm trying to add multi threading to my app (first time using this - still learning). The problem is, when I'm calling it normally everything is fine, but with std::future and std::async I'm experiencing some problems (like gl_invalid_operation when copying SFML texture or sometimes some of the letters in wstring are incorrect).
I've never touched multi threading before, but according to many tutorials, everything should be fine.
my code:
SettingsState.cpp
void SettingsState::InitState()
{
#define ASYNC 1
#if ASYNC
// Weird behavior
std::future<void> gen_gui_init = std::async(std::launch::async, &SettingsState::InitGenSetGUI, this);
std::future<void> win_sett_init = std::async(std::launch::async, &SettingsState::InitWindowSettings, this);
std::future<void> aud_sett_init = std::async(std::launch::async, &SettingsState::InitAudioSettings, this);
std::future<void> sim_sett_init = std::async(std::launch::async, &SettingsState::InitSimulationSettings, this);
std::future<void> key_sett_init = std::async(std::launch::async, &SettingsState::InitKeybindsSettings, this);
#else
// Everything is fine
this->InitGenSetGUI();
this->InitWindowSettings();
this->InitAudioSettings();
this->InitSimulationSettings();
this->InitKeybindsSettings();
#endif
}
SettingsState.hpp
class SettingsState :
public State
{
public:
// constructors
void InitState();
void InitGenSetGUI();
void InitWindowSettings();
void InitAudioSettings();
void InitSimulationSettings();
void InitKeybindsSettings();
// other methods and members
};
I think something is wrong with std::future, but as I said, I've just touched it and cannot find the answer. Thanks in advance
Other Inits:
void SettingsState::InitGenSetGUI()
{
const int types_number = 4;
//const int wSettingsColorsCount = 26;
sf::Event fake_event;
m_stateBackground.create(winSize, { 0, 0 }, ke::Origin::LEFT_TOP, "Textures/earth_view2.png");
m_backgroundMask.create(winSize, { 0, 0 }, ke::Origin::LEFT_TOP, L"", 0, {}, sf::Color(0, 0, 0, 255.f - 255.f * AppSettings::BackgroundBrightness() * 0.01f));
m_stateMask.create(winSize, { 0, 0 }, ke::Origin::LEFT_TOP, {}, {}, {}, sf::Color(0, 0, 0, 0));
// SETTINGS GUI
// window settings types
m_settings_types.reserve(types_number);
m_settings_types.emplace_back(std::make_unique<ke::Rectangle>(winSize / 9.f, sf::Vector2f(1 * winSize.x / 9, winSize.y / 18), ke::Origin::LEFT_TOP, L"Window", winSize.y / 32.f, ke::Origin::MIDDLE_MIDDLE, sf::Color::Transparent, sf::Color(255, 255, 255, 255)));
m_settings_types.emplace_back(std::make_unique<ke::Rectangle>(winSize / 9.f, sf::Vector2f(3 * winSize.x / 9, winSize.y / 18), ke::Origin::LEFT_TOP, L"Audio", winSize.y / 32.f, ke::Origin::MIDDLE_MIDDLE, sf::Color::Transparent, sf::Color(255, 255, 255, 128)));
m_settings_types.emplace_back(std::make_unique<ke::Rectangle>(winSize / 9.f, sf::Vector2f(5 * winSize.x / 9, winSize.y / 18), ke::Origin::LEFT_TOP, L"Simulation", winSize.y / 32.f, ke::Origin::MIDDLE_MIDDLE, sf::Color::Transparent, sf::Color(255, 255, 255, 128)));
m_settings_types.emplace_back(std::make_unique<ke::Rectangle>(winSize / 9.f, sf::Vector2f(7 * winSize.x / 9, winSize.y / 18), ke::Origin::LEFT_TOP, L"Keybinds", winSize.y / 32.f, ke::Origin::MIDDLE_MIDDLE, sf::Color::Transparent, sf::Color(255, 255, 255, 128)));
m_selected_type_itr = m_settings_types.begin();
for (auto& itr : m_settings_types)
itr->update({ 0, 0 }, fake_event, sf::Mouse::Left, nullptr);
// separation bar
m_separation_bar.create({ winSize.x, winSize.y / 576 }, { 0, winSize.y / 4.5f }, ke::Origin::LEFT_MIDDLE, {}, {}, {}, sf::Color(255, 255, 255, 160));
// slider
m_slider.create({ winSize.x / 100, winSize.y - winSize.y / 4.5f }, { winSize.x, winSize.y / 4.5f }, viewSize.y * 1.1f, ke::Origin::RIGHT_TOP, nullptr, nullptr, sf::Color(192, 192, 192, 128), sf::Color(128, 128, 128, 128));
// apply and restore defaults button
m_apply_button.create({ winSize.x * 0.1f, winSize.y * 0.05f }, { winSize.x / 6.f, 0.95f * winSize.y }, ke::RIGHT_TOP, L"Apply", winSize.y / 32.f, ke::Origin::MIDDLE_MIDDLE, sf::Color(128, 128, 128, 64), sf::Color(192, 192, 192, 192));
m_restore_def_buttoon.create({ winSize.x * 0.1f, winSize.y * 0.05f }, { winSize.x / 6.f, 0.95f * winSize.y }, ke::LEFT_TOP, L"Restore defaults", winSize.y / 48.f, ke::Origin::MIDDLE_MIDDLE, sf::Color(128, 128, 128, 128), sf::Color(192, 192, 192, 255));
}
////////////////////////////////////////////////////////////////
void SettingsState::InitWindowSettings()
{
// WINDOW SETTINGS
sf::Event fake_event;
auto color_itr = m_windowSettings_colors.begin();
// FPS bars
m_maxMenuFPS_bar.create({ winSize.x / 6, winSize.y / 24 }, { 0.6f * winSize.x, 4 * winSize.y * 0.1f }, nullptr, AppSettings::MaxMenuFPS(), 30, 240, ke::Origin::LEFT_MIDDLE, sf::Color::Black, sf::Color(255, 255, 255, 160), winSize.y / 450, 0, sf::Color(255, 255, 255, 160), sf::Color::Transparent);;
m_maxSimFPS_bar.create({ winSize.x / 6, winSize.y / 24 }, { 0.6f * winSize.x, 5 * winSize.y * 0.1f }, nullptr, AppSettings::MaxSimulationFPS(), 120, 960, ke::Origin::LEFT_MIDDLE, sf::Color::Black, sf::Color(255, 255, 255, 160), winSize.y / 450, 0, sf::Color(255, 255, 255, 160), sf::Color::Transparent);;
// FPS bars accessories
m_WS_accessories.reserve(11);
m_WS_accessories.emplace_back(std::make_unique<ke::Rectangle>(sf::Vector2f(winSize.y / 24.f, winSize.y / 24.f), sf::Vector2f(0.6f * winSize.x, 4 * winSize.y * 0.1f), ke::Origin::RIGHT_MIDDLE, "Textures/left_arrow2.png"));
m_WS_accessories.emplace_back(std::make_unique<ke::Rectangle>(sf::Vector2f(winSize.y / 24.f, winSize.y / 24.f), sf::Vector2f(23.f * winSize.x / 30, 4 * winSize.y * 0.1f), ke::Origin::LEFT_MIDDLE, "Textures/right_arrow2.png"));
m_WS_accessories.emplace_back(std::make_unique<ke::Rectangle>(sf::Vector2f(winSize.x / 6.f, winSize.y / 24.f), sf::Vector2f(0.4f * winSize.x, 4 * winSize.y * 0.1f), ke::Origin::RIGHT_MIDDLE, L"Menu FPS limit", winSize.y / 32, ke::Origin::RIGHT_MIDDLE, sf::Color::Transparent, sf::Color(255, 255, 255, 160)));
m_WS_accessories.emplace_back(std::make_unique<ke::Rectangle>(sf::Vector2f(winSize.y / 24.f, winSize.y / 24.f), sf::Vector2f(0.6f * winSize.x, 4 * winSize.y * 0.1f), ke::Origin::LEFT_MIDDLE, std::to_wstring(AppSettings::MaxMenuFPS()), winSize.y / 48, ke::Origin::LEFT_MIDDLE, sf::Color::Transparent, sf::Color::Black, 0, sf::Color::Transparent, 0, sf::Text::Regular, sf::Vector2f(2 * winSize.y / 450, 0)));
m_WS_accessories.emplace_back(std::make_unique<ke::Rectangle>(sf::Vector2f(winSize.y / 24.f, winSize.y / 24.f), sf::Vector2f(0.6f * winSize.x, 5 * winSize.y * 0.1f), ke::Origin::RIGHT_MIDDLE, "Textures/left_arrow2.png"));
m_WS_accessories.emplace_back(std::make_unique<ke::Rectangle>(sf::Vector2f(winSize.y / 24.f, winSize.y / 24.f), sf::Vector2f(23.f * winSize.x / 30, 5 * winSize.y * 0.1f), ke::Origin::LEFT_MIDDLE, "Textures/right_arrow2.png"));
m_WS_accessories.emplace_back(std::make_unique<ke::Rectangle>(sf::Vector2f(winSize.x / 6.f, winSize.y / 24.f), sf::Vector2f(0.4f * winSize.x, 5 * winSize.y * 0.1f), ke::Origin::RIGHT_MIDDLE, L"Simulation FPS limit", winSize.y / 32, ke::Origin::RIGHT_MIDDLE, sf::Color::Transparent, sf::Color(255, 255, 255, 160)));
m_WS_accessories.emplace_back(std::make_unique<ke::Rectangle>(sf::Vector2f(winSize.y / 24.f, winSize.y / 24.f), sf::Vector2f(0.6f * winSize.x, 5 * winSize.y * 0.1f), ke::Origin::LEFT_MIDDLE, std::to_wstring(AppSettings::MaxSimulationFPS()), winSize.y / 48, ke::Origin::LEFT_MIDDLE, sf::Color::Transparent, sf::Color::Black, 0, sf::Color::Transparent, 0, sf::Text::Regular, sf::Vector2f(2 * winSize.y / 450, 0)));
if (m_maxSimFPS_bar.getPointCount() >= 960)
m_WS_accessories.at(7)->setText(L"Unlimited");
// vertical sync status buttons
m_vSyncOn.create({ winSize.x / 12.f, winSize.y / 24.f }, { 41.f * winSize.x / 60.f, 6.f * winSize.y * 0.1f }, ke::Origin::RIGHT_MIDDLE, L"ON", winSize.y / 48, ke::Origin::MIDDLE_MIDDLE, sf::Color(160, 160, 160, 128), sf::Color::Black);
m_vSyncOff.create({ winSize.x / 12.f, winSize.y / 24.f }, { 41.f * winSize.x / 60.f, 6.f * winSize.y * 0.1f }, ke::Origin::LEFT_MIDDLE, L"OFF", winSize.y / 48, ke::Origin::MIDDLE_MIDDLE, sf::Color(160, 160, 160, 128), sf::Color::Black);
if (m_vSyncStatus)
{
m_vSyncOn.setFillColor(sf::Color(255, 255, 255, 192));
m_vSyncOn.setTextStyle(sf::Text::Bold);
}
else
{
m_vSyncOff.setFillColor(sf::Color(255, 255, 255, 192));
m_vSyncOff.setTextStyle(sf::Text::Bold);
}
// vertical sync buttons accessories
m_WS_accessories.emplace_back(std::make_unique<ke::Rectangle>(sf::Vector2f(winSize.x / 6, winSize.y / 24), sf::Vector2f(0.4f * winSize.x, 6 * winSize.y * 0.1f), ke::Origin::RIGHT_MIDDLE, L"Vertical Synchronization", winSize.y / 32, ke::Origin::RIGHT_MIDDLE, sf::Color::Transparent, sf::Color(255, 255, 255, 160)));
// bright level bar
m_bright_lvl.create({ winSize.x / 6.f, winSize.y / 24.f }, winSize.y / 49, { 41.f * winSize.x / 60.f, 7.f * winSize.y * 0.1f }, ke::Origin::MIDDLE_MIDDLE, nullptr, nullptr, sf::Color(160, 160, 160, 255), sf::Color(96, 96, 96, 255));
m_bright_lvl.setPercent(AppSettings::BackgroundBrightness());
// bright level accessories
m_WS_accessories.emplace_back(std::make_unique<ke::Rectangle>(sf::Vector2f(winSize.x / 6, winSize.y / 24), sf::Vector2f(0.4f * winSize.x, 7 * winSize.y * 0.1f), ke::Origin::RIGHT_MIDDLE, L"Background brightness", winSize.y / 32, ke::Origin::RIGHT_MIDDLE, sf::Color::Transparent, sf::Color(255, 255, 255, 160)));
// window size dropdown list
m_windowSize_drl.create({ winSize.x / 6.f, winSize.y / 24.f }, { 41.f * winSize.x / 60.f, 8.f * winSize.y * 0.1f }, "Textures/earth_view2.png", L"Something went wrong :(",
winSize.y / 48, ke::Origin::MIDDLE_MIDDLE, sf::Color::Black, sf::Color(255, 255, 255, 192), winSize.y / 450, sf::Color(255, 255, 255, 192), sf::Text::Bold);
m_windowSize_drl.addMember(nullptr, L"1024 \u00D7 576", winSize.y / 56, ke::Origin::MIDDLE_MIDDLE, sf::Color::Transparent, sf::Color(160, 160, 160, 255));
m_windowSize_drl.addMember(nullptr, L"1280 \u00D7 720", winSize.y / 56, ke::Origin::MIDDLE_MIDDLE, sf::Color::Transparent, sf::Color(160, 160, 160, 255));
m_windowSize_drl.addMember(nullptr, L"1366 \u00D7 768", winSize.y / 56, ke::Origin::MIDDLE_MIDDLE, sf::Color::Transparent, sf::Color(160, 160, 160, 255));
m_windowSize_drl.addMember(nullptr, L"1600 \u00D7 900", winSize.y / 56, ke::Origin::MIDDLE_MIDDLE, sf::Color::Transparent, sf::Color(160, 160, 160, 255));
m_windowSize_drl.addMember(nullptr, L"1920 \u00D7 1080", winSize.y / 56, ke::Origin::MIDDLE_MIDDLE, sf::Color::Transparent, sf::Color(160, 160, 160, 255));
m_windowSize_drl.addMember(nullptr, L"1920 \u00D7 1080 Fullscreen", winSize.y / 56, ke::Origin::MIDDLE_MIDDLE, sf::Color::Transparent, sf::Color(160, 160, 160, 255));
for (auto& itr : *m_windowSize_drl.getMembers())
itr->update({ 0, 0 }, fake_event, sf::Mouse::Left, nullptr);
if (AppSettings::DefaultWindowSize() == sf::Vector2f(1024, 576)) m_windowSize_drl.setMemberAsActive(0);
if (AppSettings::DefaultWindowSize() == sf::Vector2f(1280, 720)) m_windowSize_drl.setMemberAsActive(1);
if (AppSettings::DefaultWindowSize() == sf::Vector2f(1366, 768)) m_windowSize_drl.setMemberAsActive(2);
if (AppSettings::DefaultWindowSize() == sf::Vector2f(1600, 900)) m_windowSize_drl.setMemberAsActive(3);
if (AppSettings::DefaultWindowSize() == sf::Vector2f(1920, 1080)) m_windowSize_drl.setMemberAsActive(4);
if (AppSettings::DefaultWindowSize() == sf::Vector2f(1920, 1080)) m_windowSize_drl.setMemberAsActive(5);
m_start_window_size = m_windowSize_drl.getSelectedID();
m_current_window_size = m_windowSize_drl.getSelectedID();
// window size dropdown list accessories
m_WS_accessories.emplace_back(std::make_unique<ke::Rectangle>(sf::Vector2f(winSize.x / 6, winSize.y / 24), sf::Vector2f(0.4f * winSize.x, 8 * winSize.y * 0.1f), ke::Origin::RIGHT_MIDDLE, L"Window Resolution", winSize.y / 32, ke::Origin::RIGHT_MIDDLE, sf::Color::Transparent, sf::Color(255, 255, 255, 160)));
}
Aucun commentaire:
Enregistrer un commentaire