Форум » [x]Harbour » Кто вошел в программу / Who logged in application ? » Ответить

Кто вошел в программу / Who logged in application ?

Andrey: Что то достали меня юзера при режиме обновления баз программы. Т.е. нужно одному юзеру войти в программу и обновить базы (если есть обновление) в монопольном режиме. А они стали тупить, других юзеров не выгоняют из программы. Программа работает в сети (файл-серверный вариант) или на серверном компе (сервер-терминалов вариант). И ещё появилась БОЛЬШАЯ потребность - определить сколько юзеров в программе, т.е. сделать запрет запуска программы, если кол-во рабочих станций больше заданного параметра (допустим разрешён запуск 5 программ в сети или на сервере-терминалов). Я знаю и применяю у себя такой простой вариант: через логин-файл-журнал входа в программу. DBF-файл открываю в многопользовательком режиме и записываю запись при входе нового пользователя. При выходе из программы - удаляю пользователя. Недостаток этого варианта - если комп "отвалиться" от сети - ушедший юзер будет числиться подключённым к программе. Можно сделать опрос допустим через семафорный файл, но тогда нужно допустим каждые 30-40 сек. опрашивать наличие семафорного файла по указанному пути. Это будет не слишком затратной операцией ? Почитал про Мультивещание - https://ru.m.wikipedia.org/wiki/%D0%9C%D1%83%D0%BB%D1%8C%D1%82%D0%B8%D0%B2%D0%B5%D1%89%D0%B0%D0%BD%D0%B8%D0%B5 или http://linkmeup.ru/blog/129.html Интересно, но сколько кода писать нужно.... Предложили мне вариант создание службы для своей программы ! Пока читаю... Кто и какие варианты делает для опроса из своей программы - "Кто вошел в программу" ?

Ответов - 7

fil: В одной задаче использовал журнал (локирование строки и признак нормального выхода) В другой вешал сокет на сервер и юзера, при открытии своей проги, коннектились с этим сокетом. А уж он сам разбирался кто как отвалился. Правда я это делал для юзеров, которые обращались к серверу с таблетки по внешнему IP

SergKis: Andrey пишет Кто и какие варианты делает для опроса из своей программы - "Кто вошел в программу" ? LetoDb - переменные памяти. Добавь в свою программу LetoDb только для этих дел (регистрация пользователей в переменных памяти и контроль кол-ва) , потом, со временем, исп. Lock\Unlock команды сервера для замены версии\баз ... Leto, как понимаю будет локальным

SergKis: PS Можешь контроль входа user, password перевести на LetoDb - тогда больше 5 (?) не подконнектятся и будет тебе ... ну что то будет


Andrey: SergKis пишет: LetoDb - переменные памяти. К сожалению не могу использовать это. Не у всех стоит модуль передачи баз по LetoDb. Большая часть вообще использует локальный вариант - одну программу. Хотя в этой идее что-то есть ! Буду думать... Если на главное окно программы повесить таймер и каждые 60 сек. записывать (код оператора+имя оператора) в DBF-файл, то это сильно будет напрягать систему ?

Dima: Andrey пишет: записывать (код оператора+имя оператора) в DBF-файл, то это сильно будет напрягать систему ? Не попробуешь , не узнаешь.

SergKis: Andrey пишетэто сильно будет напрягать систему ? Посмотри еще раз пример из темы GUI "Вылет из программы" http://my-files.ru/gkupot Жми кнопку Start пока не надоест и смотри как работает перемещение, выбор даты в календаре. На каждом окне два таймера на 200 и 1000 миллисекунд Не у всех стоит модуль передачи баз по LetoDb. Ты не внимательно прочитал, я предложил ставить leto local у программы, не связанной с существ. передачей данных. Исп. для коннекта и контроля user-ов, смены версии, базы использовав Lock\Unlock сервера (блокируя работу) Плюс можно организовать сообщения user-ам о приостановке работы на время тех. работ записывать (код оператора+имя оператора) в DBF-файл Добавь дату, время для актуальности, что бы понимать, что не отвалился\подвис user

Sergy: Использую простейший вариант: в папке с данным \\srvr\data создал каталог \logs, куда при старте программы каждый ее экземпляр скидывает текстовый файл-семафор с диагностической инфой. Файл назван по имени рабочей станции, например: work_056.log - т.е. признак того, что программа номер 056 запущена. Фоновый процесс, запущенный по hb_IdleAdd() обновляет его раз в минуту: внутрь пишется код текущего юзера, всякие MEMORY(x), стек вызовов через PROCNAME(x) / PROCLINE(x) и тп фигню. В случае корректного выхода и/или контролируемого Run Time Error - файл удаляется. В случае зависа/reset/выдергивания шнура питания из UPS - файл остается, но и дата/время файла больше не обновляется. Таким образом, в любой момент времени ясно, кто в базе и чем занят. А если дата/время файла-семафора сильно отличается от текущего - значит, нужно выяснить - что случилось: может идет кл длительный процесс отчета или реально кто-то сделал перезагрузку/выключение винды и его ждет пистон... Кроме этого, на время обслуживания в этом-же каталоге появляется семафор stop_325.log - это значит, что машина 325 делает "что-то" такое с базой (например, реиндекс), что дальнейший вход юзеров невозможен: текущих обзваниваем, обходим, пишем смс, а новые - ждут разрешения на вход в БД до тех пор, пока в каталоге есть файл stop_*.log. Внутри него обычно пишется причина: например, восстановление после аварии, реиндекс, и планируемое время завершения обслуживания и имя юзера, который выполняет обслуживание. Ожидающий разрешения юзер это "видит" в сообщении и может использовать свое рабочее время более рационально. Например, за это время позвонить нескольким клиентам. Надежно работает уже более 20 лет. Думал сначала "модернизировать" и хранить все в одной табличке согласно записям, но с файлами произвольного формата мне оказалось удобнее работать.



полная версия страницы