PDA

Просмотр полной версии : [Вопрос] Помощь с проверкой на количество загруженных систем



Redsan
15.10.2016, 17:34
Имеется несколько систем которые при запуске/перезагрузке сервера загружаются из базы данных mysql:

mysql_function_query(MySQL, "SELECT * FROM `houses`", true, "LoadHouses","");
mysql_function_query(MySQL, "SELECT * FROM `vehicles`", true, "LoadVehicles","");
mysql_function_query(MySQL, "SELECT * FROM `zone`", true, "LoadZone","");
При подключении игрока к серверу имеется проверка на статус загрузки сервера:


/*
server_access_status = 0; // Загрузка сервера, mysql системы не загружены, kick игрока
server_access_status = 1; // Сервер загружен, mysql системы загружены, игрок может входить
server_access_status = 2; // Перезагрузка сервера, mysql системы не загружены, kick игрока
*/
switch(server_access_status)
{
case 0:
{
SendClientMessage(playerid, -1,"Происходит загрузка сервера");
return Kick(playerid);
}
case 2:
{
SendClientMessage(playerid, -1,"Происходит перезагрузка сервера");
return Kick(playerid);
}
}

Необходимо менять статус загрузки сервера после загрузки всех mysql систем.
Как лучше всего осуществлять данную проверку, с учётом того что скорость загрузки систем может изменяться?

Redsan
16.10.2016, 13:32
Пробовал делать последовательную загрузку, но тогда скорость загрузки увеличивалась в ~2 раза.

DeimoS
16.10.2016, 14:23
Так а что нужно-то?

Redsan
16.10.2016, 14:29
Так а что нужно-то?

Чтобы после загрузки всех систем, менялась глобальная переменная server_access_status на разрешающую вход на сервер.

Вот решение, но мне кажется это не самый оптимальный вариант:

#define MYSQL_SYSTEMS (3) // Количество mysql систем

new mysql_systems_loaded = 0;


// Паблик с загрузкой системы 1
mysql_systems_loaded++
if (mysql_systems_loaded == MYSQL_SYSTEMS) server_access_status = 1;

// Паблик с загрузкой системы 2
mysql_systems_loaded++
if (mysql_systems_loaded == MYSQL_SYSTEMS) server_access_status = 1;

// Паблик с загрузкой системы 3
mysql_systems_loaded++
if (mysql_systems_loaded == MYSQL_SYSTEMS) server_access_status = 1;

ziggi
16.10.2016, 14:42
new gSystemsLoaded, gSystemsCount;

stock SystemLoad(table[], callback[])
{
gSystemsCount++;
mysql_function_query(MySQL, "SELECT * FROM `%s`", true, callback, "s", table);
}

stock CheckInitStatus()
{
if (++gSystemsLoaded >= gSystemsCount) {
server_access_status = 1;
}
}

stock ResetInitStatus()
{
gSystemsLoaded = 0;
gSystemsCount = 0;
server_access_status = 2;
}

Загружать так:

SystemLoad("houses", "LoadHouses");
SystemLoad("vehicles", "LoadVehicles");
SystemLoad("zone", "LoadZone");

И в конце каждой функции с загрузкой просто добавь CheckInitStatus();. А в OnGameModeExit добавь ResetInitStatus();

Но я не вижу в этом смысла, ведь гораздо проще и логичнее для загрузки использовать не потоковые запросы (обычный mysql_query).

DeimoS
16.10.2016, 14:42
Чтобы после загрузки всех систем, менялась глобальная переменная server_access_status на разрешающую вход на сервер.

Вот решение, но мне кажется это не самый оптимальный вариант:

#define MYSQL_SYSTEMS (3) // Количество mysql систем

new mysql_systems_loaded = 0;


// Паблик с загрузкой системы 1
mysql_systems_loaded++
if (mysql_systems_loaded == MYSQL_SYSTEMS) server_access_status = 1;

// Паблик с загрузкой системы 2
mysql_systems_loaded++
if (mysql_systems_loaded == MYSQL_SYSTEMS) server_access_status = 1;

// Паблик с загрузкой системы 3
mysql_systems_loaded++
if (mysql_systems_loaded == MYSQL_SYSTEMS) server_access_status = 1;

А не проще ли сразу проверять значение mysql_systems_loaded, а не заводить лишнюю переменную? Можно функцию создать для удобства.
То бишь

stock GetServerAccessStatus() return (mysql_systems_loaded == MYSQL_SYSTEMS);

Redsan
16.10.2016, 14:50
stock CheckInitStatus(bool:reset = false)
{
static init_step;
if (reset) {
init_step = 0;
server_access_status = 0;
return;
}
if (++init_step >= MYSQL_SYSTEMS) {
server_access_status = 1;
}
}

И в конце каждой функции с загрузкой просто добавь CheckInitStatus(). А в OnGameMode добавь CheckInitStatus(true);
Благодарю.

ziggi
16.10.2016, 14:54
Благодарю. Тему можно закрыть.

Я обновил пост, там улучшенная версия.

Redsan
16.10.2016, 15:09
Я обновил пост, там улучшенная версия.

Спасибо, пожалуй все таки воспользуюсь однопоточными запросами :good2:

Тему можно закрывать.