On-line: tnsr2, гостей 0. Всего: 1 [подробнее..]
АвторСообщение
постоянный участник




Пост N: 1428
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 16.07.10 13:03. Заголовок: Как "снять" программу ?


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

Устал я бороться с юзерами. Мне эта запись нужна, а она занята...

Можно ли как то через сеть передать команду закрытия моей программе ?

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 36 , стр: 1 2 All [только новые]


Администратор




Пост N: 1597
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 16.07.10 13:13. Заголовок: Перезагрузить файл-с..


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

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1429
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 16.07.10 13:43. Заголовок: Pasha пишет: 1) Пер..


Pasha пишет:

 цитата:
1) Перезагрузить файл-сервер


Круто... Никто не позволит ! Там много юзеров работает....

Pasha пишет:

 цитата:
2) Поставить удаленное управление рабочим столом


Нельзя ! Политика безопасности на фирме не позволяет этого делать !

У меня в задаче "встроен" механизм выхода из программы. Программа каждые 2 минуты проверяет "базу выхода" (exit.dbf)
Там прописан выход для каждого пользователя.
Но дело в том - если задача "отложена", т.е. не выполняется, то и опрос базы не происходит ! При "активации" (развернуть программу) происходит опрос базы и программа "нормально" выходит с сообщением - типа идет профилактика !

Вот и хочется сделать , когда приложение не активно, чтоб его можно было закрывать !
Неужели нет специальных средст ?

А если задача выполняется на СЕРВЕРЕ-ТЕРМИНАЛОВ ?

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1806
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 16.07.10 14:04. Заголовок: я сделал проще , нап..


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

Ням
Делал на Clipper :) Выбрасывает даже если окно не активно или свернуто

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1430
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 16.07.10 14:18. Заголовок: Dima пишет: Выбрасы..


Dima пишет:

 цитата:
Выбрасывает даже если окно не активно или свернуто



Я пробовал делать что-то подобное, не получилось !

Давай на хХарборе сделаем отдельный тест ?
Я образец работы, ты как выгрузить прогу !

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 141
Зарегистрирован: 12.11.06
ссылка на сообщение  Отправлено: 16.07.10 14:42. Заголовок: Добрый день! Примеч..


Добрый день!

Примечание. Где-то с Вами обсуждали механизм записи в базы... У меня User меняет переменные памяти, а потом сбразывает их в запись, т.е. записи локируются только в момент транзакции....

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


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1431
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 16.07.10 15:17. Заголовок: AndreyZh пишет: UnL..


AndreyZh пишет:

 цитата:
UnLocker (free) и вызвав её можно "убить" любой процесс, запущенный на рабочей станции



А он удаленно, т.е. на другой машине может "убить" процесс ?


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 142
Зарегистрирован: 12.11.06
ссылка на сообщение  Отправлено: 16.07.10 15:38. Заголовок: А он удаленно, т.е. ..



 цитата:
А он удаленно, т.е. на другой машине может "убить" процесс ?



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

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 23
Зарегистрирован: 11.06.10
ссылка на сообщение  Отправлено: 16.07.10 16:11. Заголовок: Andrey пишет: Но де..


Andrey пишет:

 цитата:
Но дело в том - если задача "отложена", т.е. не выполняется, то и опрос базы не происходит !


Я так понимаю, что известен момент перехода задачи (активный/не активный), а значит нужно передать управление задачей опять же тому
Andrey пишет:

 цитата:
механизм выхода из программы. Программа каждые 2 минуты проверяет "базу выхода" (exit.dbf)


который будет работать в не активном состоянии.

Andrey пишет:

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


Какая ОС при скидании на панель задач останавливает ее выполнение?


Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 25
Зарегистрирован: 11.06.10
ссылка на сообщение  Отправлено: 16.07.10 16:31. Заголовок: Вот нацарапал func ..


Вот нацарапал

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 опускал на панель, ждал, поднимал, снова опускал - задача выполняется.


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1434
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 17.07.10 17:16. Заголовок: AlexMyr пишет: В wi..


AlexMyr пишет:

 цитата:
В windows xp опускал на панель, ждал, поднимал, снова опускал - задача выполняется.



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



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 176
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 18.07.10 13:28. Заголовок: Короче. Андрей надо ..


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

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 84
Зарегистрирован: 04.12.07
ссылка на сообщение  Отправлено: 19.07.10 11:11. Заголовок: Здесь очевидны два в..


Здесь очевидны два варианта: оперативный и не самый корректный, и постоянно действующий.

В первом случае на сервере можно закрыть открытые пользователем файлы: "Мой компьютер - Управление - Общие папки - Открытые файлы - Сортируем по пользователю - Выделяем - Закрыть открытый файл". Последствия очевидны.

Для второго нужно доработать программу: создать глобальный таймер, который опрашивает некоторую таблицу, например, один раз в минуту. В этой таблице администратор может устанавливать признак оперативного отключения пользователя и тогда, программа пользователя корректно закрывает все базы данных и интерфейс. Для GUI это довольно просто реализовать, с текстовым режимом посложнее будет.
В качестве "некоторой таблицы" можно использовать таблицу в которой вошедшие пользователи регистрируются. Для Клиппера/Харбора я делал это через блокировку записи, т.е. пользователь авторизуется через эту таблицу (там зашифрованные логин/пароль) и блокирует свою запись. Эта блокировка сохраняется до конца сеанса. В этой же таблице можно хранить многие настройки пользователя, права и прочее. В том числе и признак оперативного завершения работы.

Такую систему (принудительное завершение работы пользователя) я реализовал в программе на 1С. Работает

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 3
Зарегистрирован: 17.06.10
ссылка на сообщение  Отправлено: 19.07.10 12:08. Заголовок: В 1С, да. А вот в не..


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

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1807
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 19.07.10 12:36. Заголовок: fil Что то Вы нет т..


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

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1436
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 19.07.10 13:45. Заголовок: КСС пишет: Для втор..


КСС пишет:

 цитата:
Для второго нужно доработать программу: создать глобальный таймер, который опрашивает некоторую таблицу, например, один раз в минуту. В этой таблице администратор может устанавливать признак оперативного отключения пользователя и тогда, программа пользователя корректно закрывает все базы данных и интерфейс. Для GUI это довольно просто реализовать, с текстовым режимом посложнее будет...



Я это уже сделал на Клипере ! И до сих пор работает !
Переделал на хХарбор тоже работает !

Вопрос ТОЛЬКО один: когда задачу скидываешь на панель задач, то прекращается опрос БАЗЫ выхода....
Как реализовать "снятие" задачи в таком положении ?
Может как то Windows таймер опрашивать или еще как нибудь ...


Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 4
Зарегистрирован: 17.06.10
ссылка на сообщение  Отправлено: 19.07.10 13:55. Заголовок: Возможно. Я делал em..


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

Спасибо: 0 
ПрофильЦитата Ответить



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 19.07.10 14:06. Заголовок: Как пробудить клипперную задачу в трее


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

Спасибо: 0 
Цитата Ответить



Пост N: 5
Зарегистрирован: 17.06.10
ссылка на сообщение  Отправлено: 19.07.10 14:19. Заголовок: В смысле посадить в ..


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

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 85
Зарегистрирован: 04.12.07
ссылка на сообщение  Отправлено: 19.07.10 14:39. Заголовок: Программа в минимизи..


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

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 86
Зарегистрирован: 04.12.07
ссылка на сообщение  Отправлено: 19.07.10 14:42. Заголовок: Кстати, чтобы "п..


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

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1808
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 19.07.10 14:56. Заголовок: Andrey Только идея ..


Andrey
Только идея (черновая , ногами не пинать ) , совершенствуй.

 
#include "common.ch"
Private _xnTimeOut:=seconds()
Private activebd:=.t.

FT_OnTick({|| killuser(120)},200)


do while .t.
wait
activebd:=.t.
enddo

************
function killuser(kidos)
default kidos to 3600

if nextkey() # 0 .or. activebd
activebd:=.f.
_xnTimeOut := seconds()
return nil
else

if seconds()-_xnTimeOut>kidos
dbcommitall()
close all
? "Goodbye User Вася :)"
quit
endif

endif

return nil





PS
Clipper

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 26
Зарегистрирован: 11.06.10
ссылка на сообщение  Отправлено: 22.07.10 14:15. Заголовок: Andrey пишет: А ты ..


Andrey пишет:

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



func main()
cls
set alter on
set alter to "test01.txt"
@10,10 say "Check for exit.txt"
for i:=1 to 120
?i,time()
if file("exit.txt")
?"file exist, exit from app"
return 0
endif
inkey(2)
next
set alter off
set alter to
return nil

Проверял на XP и на 98. Запустил, опустил на панель задач, подождал, положил файл exit.txt в папку откуда запустил прогу, результат - программа завершилась.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1446
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 22.07.10 15:35. Заголовок: AlexMyr пишет: Пров..


AlexMyr пишет:

 цитата:
Проверял на XP и на 98. Запустил, опустил на панель задач, подождал, положил файл exit.txt в папку откуда запустил прогу, результат - программа завершилась.



Ну молодец ! Ну спасибо !
Значит можно "снимать" спящую задачу !!!

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 28
Зарегистрирован: 11.06.10
ссылка на сообщение  Отправлено: 22.07.10 16:41. Заголовок: Только что проверил ..


Только что проверил и для clipper - тоже работает. Но на 98 в свойствах для exe файла можна поставить опцию для фонового режима - полная остановка, тогда уже не работает.
<\/u><\/a>

Для exe файла собраного harbour - такой опции нет (хотя может не показывает. не копал сильно). Вот.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1455
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 24.07.10 12:19. Заголовок: С одним вопросом раз..


С одним вопросом разобрались.... Спасибо всем большое !

Теперь на повестке стоит другой вопрос.

Имеем расчет по базе.

БЕГУНОК("Идет расчет")
FOR nI := 1 TO ORDKEYCOUNT()
БЕГУНОК(, nI,ORDKEYCOUNT())
ORDKEYGOTO(nI)
// Расчеты
NEXT
СНЯТЬБЕГУНОК()

Как сделать, чтоб ко клавише допустим ESC можно было "выйти" или "прервать" расчеты ?

Если вставить внутрь цикла конструкцию типа:
nKey := INKEY()
IF nKey == K_ESC
EXIT
ENDIF


То расчеты иногда ДОЛЬШЕ считаются, т.е. комп "подтормаживает" !

Кто и как поступают в данной ситуации ?

И второй вопрос: Нужно ли отображать "бегунок" на каждую запись, или сделать показ допустим через 100 записей, для УСКОРЕНИЯ обсчета базы ?
Использую терминал GTWVT ! В нем вывод на экран "тормозит" выполнение задачи ?

Почему спрашиваю ? Перешел на хХарбор скорость устраивала, сейчас хочется быстрей !
Расчет по базе 30 тыс.записей, делаю разноску. Затрачивается примерно 30 мин.
Алгоритм правильный, ищет по индексам... Смущает БЕГУНОК() !



Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 33
Зарегистрирован: 11.06.10
ссылка на сообщение  Отправлено: 24.07.10 12:28. Заголовок: Что то типа так whi..


Что то типа так

while lastkey() !=K_ESC

БЕГУНОК("Идет расчет")
FOR nI := 1 TO ORDKEYCOUNT()
БЕГУНОК(, nI,ORDKEYCOUNT())
ORDKEYGOTO(nI)
// Расчеты
NEXT
СНЯТЬБЕГУНОК()

end

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1820
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 24.07.10 12:31. Заголовок: Andrey Посмотри тем..

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1456
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 24.07.10 12:40. Заголовок: AlexMyr пишет: Что ..


AlexMyr пишет:

 цитата:
Что то типа так

while lastkey() !=K_ESC



Не выйдет !
Обработка базы идет в цикле, и хоть обжимайся клавишу ESC, задача будет выполняться до последней записи !

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1457
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 24.07.10 12:52. Заголовок: Dima пишет: Посмотр..


Dima пишет:

 цитата:
Посмотри тему


Посмотрел. А как для хХарбора переделать ?
Да мне только ОДНА функция нужна (выход по ESC) при расчетах по базе !

Спасибо: 0 
ПрофильЦитата Ответить



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 24.07.10 14:25. Заголовок: Выход из цикла по ESC


Public esc_done:=.f.

//.....
go top
esc_inkey(,100)
i:=0
do while !eof()
i++ // i:=recno()
if esc_inkey(i);esc_done:=.T.;exit;endif
// .......
skip
enddo
if esc_done
// Прервано по <ESC>
endif

//.......

Function esc_inkey(r,d)
// опрос клавиатуры при просмотре базы - через 100 вызовов(записей)
// чтобы не тормозило
Static recn:=0,recd:=100
Local ret:=.f.
if d#NIL
recd:=d
endif
if abs(r-recn)>recd
h_inkey();if lastkey()=K_ESC;ret:=.t.;endif
recn:=r
endif
return ret
// ....

FUNCTION h_inkey(q) // inkey с SETKEY
Local h_key,lkey,key_bl
DO WHILE .T.
h_key=.F.
IF q=NIL;lkey=inkey();ELSE;lkey=inkey(q);ENDIF
IF lkey!=0.AND.(key_bl:=setkey(lkey))!=NIL
eval(key_bl,procname(2),procline(2),"");h_key=.T.
ENDIF
IF !h_key;EXIT;ENDIF
ENDDO
return lkey

Спасибо: 0 
Цитата Ответить
постоянный участник




Пост N: 1461
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 24.07.10 15:23. Заголовок: СПАСИБО БОЛЬШОЕ petr..


СПАСИБО БОЛЬШОЕ petr707 !!!

Кратко, логично и все понятно ....
Буду пробовать к себе в программу "прикручивать"....


Спасибо: 0 
ПрофильЦитата Ответить



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 24.07.10 16:34. Заголовок: По поводу обновления..


По поводу обновления бегунка. Известна его длина в символах (пикселах), известно и количество записей в таблице. Значит можно посчитать количество записей, через которое имеет смысл обновлять экран, чтобы не выводить многократно одно и то же.

Спасибо: 0 
Цитата Ответить
постоянный участник




Пост N: 1465
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 24.07.10 18:27. Заголовок: wad1 пишет: Значит ..


wad1 пишет:

 цитата:
Значит можно посчитать количество записей, через которое имеет смысл обновлять экран, чтобы не выводить многократно одно и то же.



Хорошая идея !
А как реализовать ?

aDim:=Бегунок("Идет расчет")
FOR nI := 1 TO nRecAll

ОбновлениеБегунка(aDim,nI,nRecAll)

NEXT
СнятиеБегунка()

/////////////////////////
ОбновлениеБегунка(aDim,nI,nRecAll)
aDim(y,x,y2,x2) - координаты начала и конца бегунка.

?



Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1829
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 24.07.10 20:55. Заголовок: Andrey Что то я не ..


Andrey
Что то я не въезжаю о чем ты ;)
Смотри (если еще Clipper остался) и модифицируй под свои нужды.
blabla:\CLIPPER\SOURCE\SAMPLE\GAUGE.PRG
blabla:\CLIPPER\SOURCE\SAMPLE\GAUGDEMO.PRG

ЗЫ
В X(harbour) это тоже есть.

Спасибо: 0 
ПрофильЦитата Ответить



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 26.07.10 11:23. Заголовок: Примерно так: local..


Примерно так:

local mlen:=60 // Это - длина бегунка, ее как-то можно вычислить
local mperiod:=nRecall/mlen // Количество записей в таблице, приходящееся на одно деление бегунка
local ni1

aDim:=Бегунок("Идет расчет")
FOR nI := 1 TO nRecAll
ni1++
if ni1=mperiod
ОбновлениеБегунка(aDim,nI,nRecAll)
ni1:=0
endif

NEXT
СнятиеБегунка()

Для универсальности лучше затолкать вычисление в "ОбновлениеБегунка".


Спасибо: 1 
Цитата Ответить
Администратор




Пост N: 1620
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 08.08.10 14:28. Заголовок: К слову, средствами ..


К слову, средствами letodb можно отключить клиентскую программу от БД

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 36 , стр: 1 2 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 201
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет