From 906c9016bb4660eb0445a3345a55ede959c3cb96 Mon Sep 17 00:00:00 2001 From: iamgoofball Date: Wed, 23 Jan 2019 00:58:30 -0800 Subject: [PATCH] Multithreaded character generation TODO: fix loading screen --- include/courtroom.h | 22 ++++++++++----------- include/lobby.h | 3 ++- src/charselect.cpp | 48 ++++++++++++++++++++++++++------------------- src/lobby.cpp | 4 ++++ 4 files changed, 44 insertions(+), 33 deletions(-) diff --git a/include/courtroom.h b/include/courtroom.h index 1c739b8..f612412 100644 --- a/include/courtroom.h +++ b/include/courtroom.h @@ -58,6 +58,7 @@ #include #include #include +#include #include class AOApplication; @@ -81,6 +82,15 @@ public: QString current_char = ""; int current_emote = 0; AOApplication *ao_app; + //abstract widget to hold char buttons + QWidget *ui_char_buttons; + QVector char_list; + QVector evidence_list; + QVector music_list; + QVector area_list; + QSignalMapper *char_button_mapper; + QVector ui_char_button_list; + QVector ui_char_button_list_filtered; void mt_pre_framegetter(int frameNumber); void mt_framegetter(int frameNumber); void reset_music_list() @@ -280,18 +290,11 @@ private: // The offset this user has given if they want to appear alongside someone. int offset_with_pair = 0; - QVector char_list; - QVector evidence_list; - QVector music_list; - QVector area_list; - QVector arup_players; QVector arup_statuses; QVector arup_cms; QVector arup_locks; - QSignalMapper *char_button_mapper; - QVector ic_chatlog_history; // These map music row items and area row items to their actual IDs. @@ -534,11 +537,6 @@ private: AOImage *ui_char_select_background; - //abstract widget to hold char buttons - QWidget *ui_char_buttons; - - QVector ui_char_button_list; - QVector ui_char_button_list_filtered; AOImage *ui_selector; AOButton *ui_back_to_lobby; diff --git a/include/lobby.h b/include/lobby.h index 19276a7..3a34fb8 100644 --- a/include/lobby.h +++ b/include/lobby.h @@ -76,7 +76,8 @@ private: AOButton *ui_cancel; void set_size_and_pos(QWidget *p_widget, QString p_identifier); - +public slots: + void fucking_threading_goddamn_it(QString fuckshitassgoddamnfuck); private slots: void on_public_servers_clicked(); void on_favorites_clicked(); diff --git a/src/charselect.cpp b/src/charselect.cpp index 8e1b912..e6d9c9f 100644 --- a/src/charselect.cpp +++ b/src/charselect.cpp @@ -5,6 +5,30 @@ #include "debug_functions.h" #include "hardware_functions.h" +class AOCharSelectGenerationThreading : public QRunnable +{ +public: + Courtroom *mycourt_fuck; + int char_num; + AOCharButton *char_button; + AOCharSelectGenerationThreading(Courtroom *my_courtroom, int character_number, AOCharButton *charbut){ + mycourt_fuck = my_courtroom; + char_num = character_number; + char_button = charbut; + } + void run() + { + AOCharButton* character = char_button; + character->reset(); + character->hide(); + character->set_image(mycourt_fuck->char_list.at(char_num).name); + mycourt_fuck->ui_char_button_list.append(character); + + mycourt_fuck->connect(character, SIGNAL(clicked()), mycourt_fuck->char_button_mapper, SLOT(map())); + mycourt_fuck->char_button_mapper->setMapping(character, mycourt_fuck->ui_char_button_list.size() - 1); + } +}; + void Courtroom::construct_char_select() { ui_char_select_background = new AOImage(this, ao_app); @@ -197,27 +221,11 @@ void Courtroom::character_loading_finished() // Later on, we'll be revealing buttons as we need them. for (int n = 0; n < char_list.size(); n++) { - AOCharButton* character = new AOCharButton(ui_char_buttons, ao_app, 0, 0, char_list.at(n).taken); - character->reset(); - character->hide(); - character->set_image(char_list.at(n).name); - ui_char_button_list.append(character); - - connect(character, SIGNAL(clicked()), char_button_mapper, SLOT(map())); - char_button_mapper->setMapping(character, ui_char_button_list.size() - 1); - - // This part here serves as a way of showing to the player that the game is still running, it is - // just loading the pictures of the characters. - if (ao_app->lobby_constructed) - { - ao_app->generated_chars++; - int total_loading_size = ao_app->char_list_size * 2 + ao_app->evidence_list_size + ao_app->music_list_size; - int loading_value = int(((ao_app->loaded_chars + ao_app->generated_chars + ao_app->loaded_music + ao_app->loaded_evidence) / static_cast(total_loading_size)) * 100); - ao_app->w_lobby->set_loading_value(loading_value); - ao_app->w_lobby->set_loading_text("Generating chars:\n" + QString::number(ao_app->generated_chars) + "/" + QString::number(ao_app->char_list_size)); - } + AOCharButton* character = new AOCharButton(ui_char_buttons, ao_app, 0, 0, char_list.at(n).taken); + AOCharSelectGenerationThreading *char_generate = new AOCharSelectGenerationThreading(this, n, character); + QThreadPool::globalInstance()->start(char_generate); } - + QThreadPool::globalInstance()->waitForDone(); filter_character_list(); } diff --git a/src/lobby.cpp b/src/lobby.cpp index 4a96e56..6f8db06 100644 --- a/src/lobby.cpp +++ b/src/lobby.cpp @@ -172,6 +172,10 @@ void Lobby::set_size_and_pos(QWidget *p_widget, QString p_identifier) } } +void Lobby::fucking_threading_goddamn_it(QString text){ + this->set_loading_text(text); +} + void Lobby::set_loading_text(QString p_text) { ui_loading_text->clear();