Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 9 из 9
  1. #1
    Аватар для Redsan
    Пользователь

    Статус
    Оффлайн
    Регистрация
    07.06.2016
    Адрес
    Minsk, Belarus
    Сообщений
    78
    Репутация:
    15 ±

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

    Имеется несколько систем которые при запуске/перезагрузке сервера загружаются из базы данных mysql:
    PHP код:
    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",""); 
    При подключении игрока к серверу имеется проверка на статус загрузки сервера:
    PHP код:
    /*
     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 в 02:46.

  2. #2
    Аватар для Redsan
    Пользователь

    Статус
    Оффлайн
    Регистрация
    07.06.2016
    Адрес
    Minsk, Belarus
    Сообщений
    78
    Репутация:
    15 ±
    Пробовал делать последовательную загрузку, но тогда скорость загрузки увеличивалась в ~2 раза.

  3. #3
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Так а что нужно-то?
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  4. #4
    Аватар для Redsan
    Пользователь

    Статус
    Оффлайн
    Регистрация
    07.06.2016
    Адрес
    Minsk, Belarus
    Сообщений
    78
    Репутация:
    15 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Так а что нужно-то?
    Чтобы после загрузки всех систем, менялась глобальная переменная server_access_status на разрешающую вход на сервер.

    Вот решение, но мне кажется это не самый оптимальный вариант:
    PHP код:
    #define MYSQL_SYSTEMS    (3) // Количество mysql систем

    new mysql_systems_loaded 0;


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

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

    // Паблик с загрузкой системы 3
    mysql_systems_loaded++
    if (
    mysql_systems_loaded == MYSQL_SYSTEMSserver_access_status 1
    Последний раз редактировалось Redsan; 16.10.2016 в 14:35.

  5. #5
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    PHP код:
    new gSystemsLoadedgSystemsCount;

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

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

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

    Загружать так:
    PHP код:
    SystemLoad("houses""LoadHouses");
    SystemLoad("vehicles""LoadVehicles");
    SystemLoad("zone""LoadZone"); 
    И в конце каждой функции с загрузкой просто добавь CheckInitStatus();. А в OnGameModeExit добавь ResetInitStatus();

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

  6. Пользователь сказал cпасибо:
    Redsan (16.10.2016)
  7. #6
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Redsan Посмотреть сообщение
    Чтобы после загрузки всех систем, менялась глобальная переменная server_access_status на разрешающую вход на сервер.

    Вот решение, но мне кажется это не самый оптимальный вариант:
    PHP код:
    #define MYSQL_SYSTEMS    (3) // Количество mysql систем

    new mysql_systems_loaded 0;


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

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

    // Паблик с загрузкой системы 3
    mysql_systems_loaded++
    if (
    mysql_systems_loaded == MYSQL_SYSTEMSserver_access_status 1
    А не проще ли сразу проверять значение mysql_systems_loaded, а не заводить лишнюю переменную? Можно функцию создать для удобства.
    То бишь
    PHP код:
    stock GetServerAccessStatus() return (mysql_systems_loaded == MYSQL_SYSTEMS); 
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  8. Пользователь сказал cпасибо:
    Redsan (16.10.2016)
  9. #7
    Аватар для Redsan
    Пользователь

    Статус
    Оффлайн
    Регистрация
    07.06.2016
    Адрес
    Minsk, Belarus
    Сообщений
    78
    Репутация:
    15 ±
    Цитата Сообщение от ziggi Посмотреть сообщение
    PHP код:
    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);
    Благодарю.
    Последний раз редактировалось Redsan; 16.10.2016 в 14:55.

  10. #8
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Цитата Сообщение от Redsan Посмотреть сообщение
    Благодарю. Тему можно закрыть.
    Я обновил пост, там улучшенная версия.

  11. Пользователь сказал cпасибо:
    Redsan (16.10.2016)
  12. #9
    Аватар для Redsan
    Пользователь

    Статус
    Оффлайн
    Регистрация
    07.06.2016
    Адрес
    Minsk, Belarus
    Сообщений
    78
    Репутация:
    15 ±
    Цитата Сообщение от ziggi Посмотреть сообщение
    Я обновил пост, там улучшенная версия.
    Спасибо, пожалуй все таки воспользуюсь однопоточными запросами

    Тему можно закрывать.
    Последний раз редактировалось Redsan; 16.10.2016 в 15:23.

 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •