Форум » [x]Harbour » Как "снять" программу ? » Ответить

Как "снять" программу ?

Andrey: Всем привет ! Столкнулся с такой проблемой.... Есть МОЯ сетевая программа. Юзер запустил ее и ушел закрыв свой кабинет ! Прогу скинул на панель задач, т.е. отложил выполнение моей программы, хотя базы открыты и одна текущая запись - блокирована. Вопрос: каким образом можно завершить задачу в таком положении ??? Т.е. каким образом можно сделать QUIT в программе в таком положении ? Устал я бороться с юзерами. Мне эта запись нужна, а она занята... Можно ли как то через сеть передать команду закрытия моей программе ?

Ответов - 36, стр: 1 2 All

Pasha: 1) Перезагрузить файл-сервер 2) Поставить удаленное управление рабочим столом

Andrey: Pasha пишет: 1) Перезагрузить файл-сервер Круто... Никто не позволит ! Там много юзеров работает.... Pasha пишет: 2) Поставить удаленное управление рабочим столом Нельзя ! Политика безопасности на фирме не позволяет этого делать ! У меня в задаче "встроен" механизм выхода из программы. Программа каждые 2 минуты проверяет "базу выхода" (exit.dbf) Там прописан выход для каждого пользователя. Но дело в том - если задача "отложена", т.е. не выполняется, то и опрос базы не происходит ! При "активации" (развернуть программу) происходит опрос базы и программа "нормально" выходит с сообщением - типа идет профилактика ! Вот и хочется сделать , когда приложение не активно, чтоб его можно было закрывать ! Неужели нет специальных средст ? А если задача выполняется на СЕРВЕРЕ-ТЕРМИНАЛОВ ?

Dima: я сделал проще , написал процедурку. если юзер не активен в течении определенного промежутка времени (кнопки не нажимал и что то еще не помню уже) то его автоматом выбрасывает из проги. сразу говорю что писать тебе Андрей придется свою процедуру и моя тебе просто не подойдет (там свои заморочки) Ням Делал на Clipper :) Выбрасывает даже если окно не активно или свернуто


Andrey: Dima пишет: Выбрасывает даже если окно не активно или свернуто Я пробовал делать что-то подобное, не получилось ! Давай на хХарборе сделаем отдельный тест ? Я образец работы, ты как выгрузить прогу !

AndreyZh: Добрый день! Примечание. Где-то с Вами обсуждали механизм записи в базы... У меня User меняет переменные памяти, а потом сбразывает их в запись, т.е. записи локируются только в момент транзакции.... Ну а Вашем случае - на сервер поставьте программу "контроля процессов", например UnLocker (free) и вызвав её можно "убить" любой процесс, запущенный на рабочей станции. При этом Clipper (xHarb тоже проверено) разблокирует запись и "сбросит буфер".

Andrey: AndreyZh пишет: UnLocker (free) и вызвав её можно "убить" любой процесс, запущенный на рабочей станции А он удаленно, т.е. на другой машине может "убить" процесс ?

AndreyZh: А он удаленно, т.е. на другой машине может "убить" процесс ? Конечно нет! Но если процесс на удалённой машине при помощи данной утилиты можно убрать локировку файлов на сервере - данные же на нём находятся?

AlexMyr: Andrey пишет: Но дело в том - если задача "отложена", т.е. не выполняется, то и опрос базы не происходит ! Я так понимаю, что известен момент перехода задачи (активный/не активный), а значит нужно передать управление задачей опять же тому Andrey пишет: механизм выхода из программы. Программа каждые 2 минуты проверяет "базу выхода" (exit.dbf) который будет работать в не активном состоянии. Andrey пишет: Прогу скинул на панель задач, т.е. отложил выполнение моей программы, хотя базы открыты и одна текущая запись - блокирована. Какая ОС при скидании на панель задач останавливает ее выполнение?

AlexMyr: Вот нацарапал func main() set alter on set alter to "test01.txt" for i:=1 to 120 ?time() inkey(1) next set alter off set alter to return nil В windows xp опускал на панель, ждал, поднимал, снова опускал - задача выполняется.

Andrey: AlexMyr пишет: В windows xp опускал на панель, ждал, поднимал, снова опускал - задача выполняется. А ты попробуй эту программу "снять" когда она на панели.... Т.е. пускай программа проверяет наличие ОПРЕДЕЛЕННОГО файла в этой папке, и если он появился, то снять задачу !

Vlad04: Короче. Андрей надо тебе менять подход, а не искать выход из подобной ситуации. У меня запись блокируется только в момент сохранения изменения!Это мгновения. В режиме редактирования может висеть сколько угодно - потому что , редактирую тся значения переменных в памяти, а потом они сбрасываются измененными в таблицу.

КСС: Здесь очевидны два варианта: оперативный и не самый корректный, и постоянно действующий. В первом случае на сервере можно закрыть открытые пользователем файлы: "Мой компьютер - Управление - Общие папки - Открытые файлы - Сортируем по пользователю - Выделяем - Закрыть открытый файл". Последствия очевидны. Для второго нужно доработать программу: создать глобальный таймер, который опрашивает некоторую таблицу, например, один раз в минуту. В этой таблице администратор может устанавливать признак оперативного отключения пользователя и тогда, программа пользователя корректно закрывает все базы данных и интерфейс. Для GUI это довольно просто реализовать, с текстовым режимом посложнее будет. В качестве "некоторой таблицы" можно использовать таблицу в которой вошедшие пользователи регистрируются. Для Клиппера/Харбора я делал это через блокировку записи, т.е. пользователь авторизуется через эту таблицу (там зашифрованные логин/пароль) и блокирует свою запись. Эта блокировка сохраняется до конца сеанса. В этой же таблице можно хранить многие настройки пользователя, права и прочее. В том числе и признак оперативного завершения работы. Такую систему (принудительное завершение работы пользователя) я реализовал в программе на 1С. Работает

fil: В 1С, да. А вот в неактивной задачке на xHarbour таймер не отрабатывает.Я это решал через tray(в FWH)

Dima: fil Что то Вы нет так делаете парни. Если уж на Clipper удалось это сделать то на X(Harbour) верняк можно сделать. Предположим что в Вашей проге формируется какой то большой отчет , минут на 5 скажем. Если свернуть окно задачи и заниматься какими то другими делами , задача продолжает работать или останавливается ? Если работает , то и таймер должен работать или что Вы там вешали.

Andrey: КСС пишет: Для второго нужно доработать программу: создать глобальный таймер, который опрашивает некоторую таблицу, например, один раз в минуту. В этой таблице администратор может устанавливать признак оперативного отключения пользователя и тогда, программа пользователя корректно закрывает все базы данных и интерфейс. Для GUI это довольно просто реализовать, с текстовым режимом посложнее будет... Я это уже сделал на Клипере ! И до сих пор работает ! Переделал на хХарбор тоже работает ! Вопрос ТОЛЬКО один: когда задачу скидываешь на панель задач, то прекращается опрос БАЗЫ выхода.... Как реализовать "снятие" задачи в таком положении ? Может как то Windows таймер опрашивать или еще как нибудь ...

fil: Возможно. Я делал embedding 1С из Harbour и хотел по таймеру чего-то там менять в 1С. Не получилось.

petr707: Можно применить методику дополнительного стороннего агента - программы , которая по своему расписанию или по заданию планировщика Widndows ( раз в минуту) поднимает задачу из трея ( восстанавливает окно) по имени или хендлу окна основной задачи. Когда задача "проснется" , то и завершит себя сама.

fil: В смысле посадить в tray контролера, который периодически ищет хендл окна главной аппликации и если не активен, то поднимает его ? Или нужно брать хендл задачи, но как тогда определить активна она или нет ?

КСС: Программа в минимизированном режиме - это не "заснувшая" программа, и в этом режиме она может и должна работать: формировать отчеты (как тут писали), обрабатывать данные и т.д. Стало быть и таймер должен работать. Сам не проверял, но если это так, то это недоработка Харбора. Надо бы услышать мнение наших гуру.

КСС: Кстати, чтобы "поднять" программу из панели задач можно использовать бесплатный AutoIt - превосходный opensource проект как раз для этих целей. Думаю в пару десятков строк можно будет уложиться.



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