Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: Изменение параметра по времени  (Прочитано 42694 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« : 18-08-2007 15:03 » 

Еще один вопрос... как можно изменять значение переменной через определённый промежуток времени? Возможно в MySQL есть тип данных который является как таковым "таймером" , ориентируясь на который можно изменять значение переменной в коде пхп?
Записан
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 18-08-2007 15:30 » 

Код:
 
   $timereg=date(s);
   $hpsql=" update player set
             hp=hp+'1' 
             where login=
             '" . mysql_escape_string($_SESSION['login']) . "'; "; //

    if($hp<$maxhp)
     {
        if(strcmp($timereg,'15')==0) mysql_query($hpsql);
     }

Попытался реализовать через такую конструкцию, которая увеличивала бы значение столбца hp на еденицу каждую минуту, однако она работает только при постоянном обновлении. Очень интересно как можно реализовать такое действие.
« Последнее редактирование: 18-08-2007 15:32 от FallenSoul » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 18-08-2007 18:01 » 

Еще один вопрос... как можно изменять значение переменной через определённый промежуток времени? Возможно в MySQL есть тип данных который является как таковым "таймером" , ориентируясь на который можно изменять значение переменной в коде пхп?
Нет, в MySQL пока нет планируемых задач, как в том же Oracle. Нужно воспользоваться планировщиком ОС.
Вообще, постановка вопроса туманная... Web-задачи не используют таймеры - они должны выполняться максимально быстро.
Если ты хочешь подсчитать клиента время онлайн, то обновить его можно только запросом. Можно вставить в страницу JavaScript, который быдет выполнять AJAX (или подобные) запросы и по ним обновлять время, но это тоже не дает реальной гарантии. Ведь пользователь мог просто не закрыть страницу и уйти...

Web-задачи выполняются как события. Событием является запрос клиента к серверу. Программа возвращает ответ и завершается. Она не вечна!

На мой взгляд, лучше указывать год поступления , что даст возможность вычислять курс
А если у студента был акедемический отпуск, то из года поступления курс не вычислишь...
« Последнее редактирование: 18-08-2007 18:06 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 18-08-2007 18:14 » 

Еще один вопрос... как можно изменять значение переменной через определённый промежуток времени? Возможно в MySQL есть тип данных который является как таковым "таймером" , ориентируясь на который можно изменять значение переменной в коде пхп?
Нет, в MySQL пока нет планируемых задач, как в том же Oracle. Нужно воспользоваться планировщиком ОС.
Вообще, постановка вопроса туманная... Web-задачи не используют таймеры - они должны выполняться максимально быстро.
Если ты хочешь подсчитать клиента время онлайн, то обновить его можно только запросом. Можно вставить в страницу JavaScript, который быдет выполнять AJAX (или подобные) запросы и по ним обновлять время, но это тоже не дает реальной гарантии. Ведь пользователь мог просто не закрыть страницу и уйти...

Web-задачи выполняются как события. Событием является запрос клиента к серверу. Программа возвращает ответ и завершается. Она не вечна!

На мой взгляд, лучше указывать год поступления , что даст возможность вычислять курс
А если у студента был акедемический отпуск, то из года поступления курс не вычислишь...

Все играли в онлайн игры? То что касается изменения значения переменной во времени то это "регенерация жизней" если они не равны максимальному кол-ву. Вот такой сценарий хотелось бы реализовать, допустим шестая часть всех жизней в минуту.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 18-08-2007 20:08 » 

При многопользовательской игре я бы вынес все периодические задачи из интерфейсной части - нужен постоянно работающий процесс, который будет обрабатывать логику игры вне зависимости от запросов пользователей.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 18-08-2007 20:58 » 

Столько слов незнакомых =\ Можно хоть немного попроще для не посвященных ?
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 18-08-2007 21:07 » 

Ээээ... Куда проще то? Что именно не понятно?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #7 : 18-08-2007 21:16 » 

Это значит, что нужен выделенный сервер, специально для игры. На котором будет крутится оболочка игры. Которая будет отслеживать взаимодействия всех пользователей. И на сервере также будет сушествовать вэб интерфейс. Который просто будет выдавать по запросу пользователя текушее состояние его персонажа.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 18-08-2007 21:33 » 

А можно еще немного разъяснить про веб интерфейс который будет выдавать по запросу пользователя текущее состояние его персонажа ? Каким образом это организовывается или где можно почитать теорию об этом,а то оч. много вопросов
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #9 : 18-08-2007 22:51 » 

это взаимодействие двух процессов на одной системе. Читай как оно реализуется. Есть очень много способов. От расщаривания памяти, и до использования SQL серверов.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 19-08-2007 07:49 » 

А какую нибудь ссылку или ключевое слово можешь дать?
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 19-08-2007 09:47 » 

FallenSoul, например: "IPC" (межпроцессные комуникации) и "база данных".
Через базу будет самое простое.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 19-08-2007 12:11 » 

Нашел небольшую статью которая описывает некоторые IPC -через сокеты, или расшаривание памяти, ActiveX-но там всё в 3-4 строчки а уже что всё это из себя представляет не могу найти. Мб есть какие то учебники или статьи основопологающие?
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #13 : 19-08-2007 12:29 » 

FallenSoul, А как ты работал с базами данных? Ядро игры корректирует данные по игроку, загоняя данные в базу. Вэб интерфейс просто выбирает все данные по игроку и выдает их пользователю. Медленно и сердито.
Если хочеш дальше копать. Очень много материала в книге Дж. Рихтер "Windows - для проффессионалов". Но эта книга для прочтения требует определенных предварительных знаний и навыков.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #14 : 19-08-2007 16:20 » 

Я понимаю как взаимодействие происходит игрок->сервер. Игрок делает дейтсвие на что в его личной записи в базе данных в соответствующем поле происходит изменение в зависимости от того что он сделал. Точно так же я представлял изменение переменной "текущие жизни" через некоторый промежуток но вот как сделать это автономным процессом который выполнялся без каких либо действий игрока мне не понятно.

ПХП код то там элементарный однако он требует запуска, а запуск только при обновлении страницы а это немного не то.

2Про выбирает данные по игроку и выдаёт их пользователю это мне в целом понятно-у меня есть закладка "Персонаж" где построчно выдаются характеристики игрока которые забиты в его уч. записи в таблице MySQl.
« Последнее редактирование: 19-08-2007 16:22 от FallenSoul » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #15 : 19-08-2007 17:17 » 

FallenSoul, еще раз: тебе нужна постоянно работающая программа (на любом языке), которая будет делать расчеты, не зависящие от посещения игроков. Это к web-приложению отношение не имеет (разве что они будут работать с одной базой).
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #16 : 19-08-2007 19:10 » 

Ты меня этим в тупик поставил. Я изучал С++ целый год в институте, структурированное и ооп но с трудом могу представить как можно написать такое.

Если я правильно понял, то под эти расчёты будет подпадать изменение переменной через какое то время,- аля регенерация жизней ?

Код:
колонка в таблице 'online="переменная 1/0 изменяющая своё значение на 1 при заходе(начале сессии) и 0 при её завершении(аля вход игрока в игру)';
int hp= "запрос в базу данных с игроком о его кол-ве жизней в текущий момент";


переменная="поиск игроков у которых переменная online=1";

while(мб даже бесконечный)
 if(переменная)
 int maxhp= "запрос в базу данных на формулу вычисляющую макс. кол-во хп через какой то параметр";
  if(hp найденного персонажа<maxhp)
   while(hp<maxhp)
    {
     delay(30000); // 30 sec
     "запрос увеличения на еденицу значения текущих жизней в таблице игрока";
    }
 

Вот так вот я смутно представил в своей голове "постоянно работающую программу кот будет делать расчёты". Это то что понадобится?
« Последнее редактирование: 19-08-2007 19:15 от FallenSoul » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #17 : 19-08-2007 19:49 » 

Примерно так, хотя реализации могут быть разными.

Тебя смущает "постоянно работающая"? Это не значит, что она постоянно что-то делает.
Поясню на примере...

У тебя запущен браузер - это постояно работающая задача. Пока ты с ним работаешь он постоянно загружен, хотя может ничего полезного не делать.
Браузер делает запросы на сервер, где по запросу запускаются программы - это задачи по событию (запросу). Такая задача делает свое дело и закрывается.
В винде есть "планировщик заданий" - программы, которые он запускает, будут периодическими задачами. Тоже самое, если в постоянно работающей программе какая-либо ф-ия выполняется по таймеру или в цикле с задержкой (как у тебя).

Мы совсем ушли от темы... Постороение программ ни к первоночальному вопросу, ни к базам отношения не имеет. Предлагаю разрезать тему на две части.
« Последнее редактирование: 19-08-2007 19:51 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #18 : 19-08-2007 19:53 » 

Я только за если это может помочь мне реализовать мою идею. Начнём писать или чтото надо подкорректировать ? Улыбаюсь
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #19 : 19-08-2007 20:02 » 

Сперва нужно понять, что нужно, сделать ТЗ, потом разработать и уж потом только писать. Иначе это будет впустую потеряное время.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #20 : 19-08-2007 20:09 » 

1. Нужно написать программу которая изменяла бы значение переменной в таблице через промежуток времени.
2. Программа на С++, переменная в базе данных MySql.
3. Структуру программы постарался описать выше.

Я никогда не занимался этим поэтому очень хотелось бы здоровую критику и направление на путь истинный.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #21 : 19-08-2007 20:20 » 

Если это все требования к программе, то ты ее уже практически написал выше.
Осталось только добавить работу с базой. Клиентскую библиотеку mysql с заголовками можно взять тут: http://www.mysql.com/products/connector/ .

Мелкая поправочка: рекомендую в начале цикла запомнить текущее системное время, перед задержкой вычислить, сколько времени затрачено на работу и скорректировать задержку. Это позволит более точно отмерять время.
« Последнее редактирование: 19-08-2007 20:22 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #22 : 19-08-2007 20:41 » 

А можешь немного подсказать как связать С++ и MySQl а то по ссылке там немного мутно для меня. :\ что как совсем не представляю.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #23 : 19-08-2007 22:18 » 

FallenSoul, по ссылке есть и документация. Ее читать все равно придется - чужими мозгами программировать нельзя.

Рекоменбую воспользоваться не C++-оберткой, а родным C API. Про обертку у них сказано след:
Цитата
Will it build under Visual C++.NET (a.k.a. Visual Studio 2002, a.k.a. Visual C++ 7.0) or earlier?

No, it won't.

Microsoft didn't get its Standard C++ act together until Visual C++ 2003. (a.k.a. version 7.1) If you must use older versions of VC++, you're stuck with either the C API, or the ancient 1.7.1 release of MySQL++. This version is an unofficial third-party contribution which is known to have bugs. If it works, I'm happy for you. If it breaks, you get to keep both pieces.

....
Т.е. проблемы могут быть. Обертку делает стоонняя команда и она не хочет отходить от стандартного C++ в пользу MS.
С родным API проблем быть не должно.

Примерчик для таблицы test (id INT NOT NULL, name varchar(100) NOT NULL).

Код: (C)
#include <mysql/mysql.h>
#include <stdlib.h>
#include <string.h>

char *my_host = "localhost", *my_user = "root",*my_pswd = "", *my_db = "test";

int main()
{
        MYSQL *my_conn = 0;
        MYSQL_RES       *res;
        MYSQL_ROW       row;
        char * query = "SELECT id, name FROM test";

        my_conn = mysql_init(0);

        if (!mysql_real_connect(my_conn, my_host, my_user, my_pswd, my_db, 0, 0, 0))
        {
                printf("Error: (%u) %s\n", mysql_errno(my_conn), mysql_error(my_conn));
                exit(1);
        }

        if (mysql_real_query(my_conn, query, strlen(query)))
        {
                printf("Error: (%u) %s\n", mysql_errno(my_conn), mysql_error(my_conn));
                exit(1);
        }

        if (( res = mysql_store_result(my_conn)))
        {
                while (row = mysql_fetch_row(res))
                {
                        printf("%s\t%s\n", row[0], row[1]);
                }

                mysql_free_result(res);
        }

        mysql_close(my_conn);
        return 0;
}

Обрати внимание, что возвращаются поля в виде строк, а не чисел!
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #24 : 20-08-2007 06:43 » 

Скачал MySQL C API, но не разобрался что с этим делать. Попробовать вставить заголовочные файлы в include но ничего толком не получилось.
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #25 : 20-08-2007 06:44 » 

Сперва нужно понять, что нужно, сделать ТЗ, потом разработать и уж потом только писать. Иначе это будет впустую потеряное время.
RXL 5+
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #26 : 20-08-2007 08:47 » 

FallenSoul, вот вопрос, подобный твоему. Расписано по шагам: http://forums.mysql.com/read.php?45,166435,166654#msg-166654
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #27 : 20-08-2007 10:00 » 

А можно как-то связать с Borland C++ 3.1 ?

Скопировал .h файлы в BORLAND/include , lib файлы в BORLAND/lib однако всё равно выдаёт ошибку "Unable to open include file 'mysql_version.h' " хотя он находится в той же папке что и ' mysql.h '.  Жаль
« Последнее редактирование: 20-08-2007 10:21 от FallenSoul » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #28 : 20-08-2007 13:55 » 

Начем с того, что BC++ 3.1 расчитан на работу с MSDOS - MySQL не поддерживает эту ОС...

Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #29 : 20-08-2007 14:04 » 

Начем с того, что BC++ 3.1 расчитан на работу с MSDOS - MySQL не поддерживает эту ОС...



Дело в том что у меня Visual C++ нет  :/ Возможно с Borland C++ Builder 6?

2

В C++ Builder'e 6 через Console Wizard gопробовал откомпилировать одно присоединение заголовочного файла " mysql.h " ,-выдаёт ошибку :

Код:
[C++ Error] mysql_com.h(183): E2303 Type name expected

в следующей строке.

Код:
  my_socket fd;					/* For Perl DBI/dbd */


« Последнее редактирование: 20-08-2007 14:24 от FallenSoul » Записан
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines