Multithreaded character generation TODO: fix loading screen

This commit is contained in:
iamgoofball 2019-01-23 00:58:30 -08:00
parent 13bc82094f
commit 906c9016bb
4 changed files with 44 additions and 33 deletions

View File

@ -58,6 +58,7 @@
#include <QThread> #include <QThread>
#include <QThreadPool> #include <QThreadPool>
#include <QFuture> #include <QFuture>
#include <QMetaObject>
#include <stack> #include <stack>
class AOApplication; class AOApplication;
@ -81,6 +82,15 @@ public:
QString current_char = ""; QString current_char = "";
int current_emote = 0; int current_emote = 0;
AOApplication *ao_app; AOApplication *ao_app;
//abstract widget to hold char buttons
QWidget *ui_char_buttons;
QVector<char_type> char_list;
QVector<evi_type> evidence_list;
QVector<QString> music_list;
QVector<QString> area_list;
QSignalMapper *char_button_mapper;
QVector<AOCharButton*> ui_char_button_list;
QVector<AOCharButton*> ui_char_button_list_filtered;
void mt_pre_framegetter(int frameNumber); void mt_pre_framegetter(int frameNumber);
void mt_framegetter(int frameNumber); void mt_framegetter(int frameNumber);
void reset_music_list() void reset_music_list()
@ -280,18 +290,11 @@ private:
// The offset this user has given if they want to appear alongside someone. // The offset this user has given if they want to appear alongside someone.
int offset_with_pair = 0; int offset_with_pair = 0;
QVector<char_type> char_list;
QVector<evi_type> evidence_list;
QVector<QString> music_list;
QVector<QString> area_list;
QVector<int> arup_players; QVector<int> arup_players;
QVector<QString> arup_statuses; QVector<QString> arup_statuses;
QVector<QString> arup_cms; QVector<QString> arup_cms;
QVector<QString> arup_locks; QVector<QString> arup_locks;
QSignalMapper *char_button_mapper;
QVector<chatlogpiece> ic_chatlog_history; QVector<chatlogpiece> ic_chatlog_history;
// These map music row items and area row items to their actual IDs. // These map music row items and area row items to their actual IDs.
@ -534,11 +537,6 @@ private:
AOImage *ui_char_select_background; AOImage *ui_char_select_background;
//abstract widget to hold char buttons
QWidget *ui_char_buttons;
QVector<AOCharButton*> ui_char_button_list;
QVector<AOCharButton*> ui_char_button_list_filtered;
AOImage *ui_selector; AOImage *ui_selector;
AOButton *ui_back_to_lobby; AOButton *ui_back_to_lobby;

View File

@ -76,7 +76,8 @@ private:
AOButton *ui_cancel; AOButton *ui_cancel;
void set_size_and_pos(QWidget *p_widget, QString p_identifier); void set_size_and_pos(QWidget *p_widget, QString p_identifier);
public slots:
void fucking_threading_goddamn_it(QString fuckshitassgoddamnfuck);
private slots: private slots:
void on_public_servers_clicked(); void on_public_servers_clicked();
void on_favorites_clicked(); void on_favorites_clicked();

View File

@ -5,6 +5,30 @@
#include "debug_functions.h" #include "debug_functions.h"
#include "hardware_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() void Courtroom::construct_char_select()
{ {
ui_char_select_background = new AOImage(this, ao_app); ui_char_select_background = new AOImage(this, ao_app);
@ -198,26 +222,10 @@ void Courtroom::character_loading_finished()
for (int n = 0; n < char_list.size(); n++) 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); AOCharButton* character = new AOCharButton(ui_char_buttons, ao_app, 0, 0, char_list.at(n).taken);
character->reset(); AOCharSelectGenerationThreading *char_generate = new AOCharSelectGenerationThreading(this, n, character);
character->hide(); QThreadPool::globalInstance()->start(char_generate);
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<double>(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));
} }
} QThreadPool::globalInstance()->waitForDone();
filter_character_list(); filter_character_list();
} }

View File

@ -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) void Lobby::set_loading_text(QString p_text)
{ {
ui_loading_text->clear(); ui_loading_text->clear();