Автор | Сообщение |
|
| постоянный участник
|
Пост N: 1428
Зарегистрирован: 12.09.06
|
|
Отправлено: 16.07.10 13:03. Заголовок: Как "снять" программу ?
Всем привет ! Столкнулся с такой проблемой.... Есть МОЯ сетевая программа. Юзер запустил ее и ушел закрыв свой кабинет ! Прогу скинул на панель задач, т.е. отложил выполнение моей программы, хотя базы открыты и одна текущая запись - блокирована. Вопрос: каким образом можно завершить задачу в таком положении ??? Т.е. каким образом можно сделать QUIT в программе в таком положении ? Устал я бороться с юзерами. Мне эта запись нужна, а она занята... Можно ли как то через сеть передать команду закрытия моей программе ?
|
|
|
Ответов - 36
, стр:
1
2
All
[только новые]
|
|
|
| Администратор
|
Пост N: 1597
Зарегистрирован: 23.05.05
|
|
Отправлено: 16.07.10 13:13. Заголовок: Перезагрузить файл-с..
1) Перезагрузить файл-сервер 2) Поставить удаленное управление рабочим столом
|
|
|
|
| постоянный участник
|
Пост N: 1429
Зарегистрирован: 12.09.06
|
|
Отправлено: 16.07.10 13:43. Заголовок: Pasha пишет: 1) Пер..
Pasha пишет: цитата: | 1) Перезагрузить файл-сервер |
| Круто... Никто не позволит ! Там много юзеров работает.... Pasha пишет: цитата: | 2) Поставить удаленное управление рабочим столом |
| Нельзя ! Политика безопасности на фирме не позволяет этого делать ! У меня в задаче "встроен" механизм выхода из программы. Программа каждые 2 минуты проверяет "базу выхода" (exit.dbf) Там прописан выход для каждого пользователя. Но дело в том - если задача "отложена", т.е. не выполняется, то и опрос базы не происходит ! При "активации" (развернуть программу) происходит опрос базы и программа "нормально" выходит с сообщением - типа идет профилактика ! Вот и хочется сделать , когда приложение не активно, чтоб его можно было закрывать ! Неужели нет специальных средст ? А если задача выполняется на СЕРВЕРЕ-ТЕРМИНАЛОВ ?
|
|
|
|
| |
Пост N: 1806
Зарегистрирован: 17.05.05
|
|
Отправлено: 16.07.10 14:04. Заголовок: я сделал проще , нап..
я сделал проще , написал процедурку. если юзер не активен в течении определенного промежутка времени (кнопки не нажимал и что то еще не помню уже) то его автоматом выбрасывает из проги. сразу говорю что писать тебе Андрей придется свою процедуру и моя тебе просто не подойдет (там свои заморочки) Ням Делал на Clipper :) Выбрасывает даже если окно не активно или свернуто
|
|
|
|
| постоянный участник
|
Пост N: 1430
Зарегистрирован: 12.09.06
|
|
Отправлено: 16.07.10 14:18. Заголовок: Dima пишет: Выбрасы..
Dima пишет: цитата: | Выбрасывает даже если окно не активно или свернуто |
| Я пробовал делать что-то подобное, не получилось ! Давай на хХарборе сделаем отдельный тест ? Я образец работы, ты как выгрузить прогу !
|
|
|
|
| |
Пост N: 141
Зарегистрирован: 12.11.06
|
|
Отправлено: 16.07.10 14:42. Заголовок: Добрый день! Примеч..
Добрый день! Примечание. Где-то с Вами обсуждали механизм записи в базы... У меня User меняет переменные памяти, а потом сбразывает их в запись, т.е. записи локируются только в момент транзакции.... Ну а Вашем случае - на сервер поставьте программу "контроля процессов", например UnLocker (free) и вызвав её можно "убить" любой процесс, запущенный на рабочей станции. При этом Clipper (xHarb тоже проверено) разблокирует запись и "сбросит буфер".
|
|
|
|
| постоянный участник
|
Пост N: 1431
Зарегистрирован: 12.09.06
|
|
Отправлено: 16.07.10 15:17. Заголовок: AndreyZh пишет: UnL..
AndreyZh пишет: цитата: | UnLocker (free) и вызвав её можно "убить" любой процесс, запущенный на рабочей станции |
| А он удаленно, т.е. на другой машине может "убить" процесс ?
|
|
|
|
| |
Пост N: 142
Зарегистрирован: 12.11.06
|
|
Отправлено: 16.07.10 15:38. Заголовок: А он удаленно, т.е. ..
цитата: | А он удаленно, т.е. на другой машине может "убить" процесс ? |
| Конечно нет! Но если процесс на удалённой машине при помощи данной утилиты можно убрать локировку файлов на сервере - данные же на нём находятся?
|
|
|
|
| |
Пост N: 23
Зарегистрирован: 11.06.10
|
|
Отправлено: 16.07.10 16:11. Заголовок: Andrey пишет: Но де..
Andrey пишет: цитата: | Но дело в том - если задача "отложена", т.е. не выполняется, то и опрос базы не происходит ! |
| Я так понимаю, что известен момент перехода задачи (активный/не активный), а значит нужно передать управление задачей опять же тому Andrey пишет: цитата: | механизм выхода из программы. Программа каждые 2 минуты проверяет "базу выхода" (exit.dbf) |
| который будет работать в не активном состоянии. Andrey пишет: цитата: | Прогу скинул на панель задач, т.е. отложил выполнение моей программы, хотя базы открыты и одна текущая запись - блокирована. |
| Какая ОС при скидании на панель задач останавливает ее выполнение?
|
|
|
|
| |
Пост 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 опускал на панель, ждал, поднимал, снова опускал - задача выполняется.
|
|
|
|
| постоянный участник
|
Пост N: 1434
Зарегистрирован: 12.09.06
|
|
Отправлено: 17.07.10 17:16. Заголовок: AlexMyr пишет: В wi..
AlexMyr пишет: цитата: | В windows xp опускал на панель, ждал, поднимал, снова опускал - задача выполняется. |
| А ты попробуй эту программу "снять" когда она на панели.... Т.е. пускай программа проверяет наличие ОПРЕДЕЛЕННОГО файла в этой папке, и если он появился, то снять задачу !
|
|
|
|
| постоянный участник
|
Пост N: 176
Зарегистрирован: 13.10.05
|
|
Отправлено: 18.07.10 13:28. Заголовок: Короче. Андрей надо ..
Короче. Андрей надо тебе менять подход, а не искать выход из подобной ситуации. У меня запись блокируется только в момент сохранения изменения!Это мгновения. В режиме редактирования может висеть сколько угодно - потому что , редактирую тся значения переменных в памяти, а потом они сбрасываются измененными в таблицу.
|
|
|
|
|
| |
Пост N: 84
Зарегистрирован: 04.12.07
|
|
Отправлено: 19.07.10 11:11. Заголовок: Здесь очевидны два в..
Здесь очевидны два варианта: оперативный и не самый корректный, и постоянно действующий. В первом случае на сервере можно закрыть открытые пользователем файлы: "Мой компьютер - Управление - Общие папки - Открытые файлы - Сортируем по пользователю - Выделяем - Закрыть открытый файл". Последствия очевидны. Для второго нужно доработать программу: создать глобальный таймер, который опрашивает некоторую таблицу, например, один раз в минуту. В этой таблице администратор может устанавливать признак оперативного отключения пользователя и тогда, программа пользователя корректно закрывает все базы данных и интерфейс. Для GUI это довольно просто реализовать, с текстовым режимом посложнее будет. В качестве "некоторой таблицы" можно использовать таблицу в которой вошедшие пользователи регистрируются. Для Клиппера/Харбора я делал это через блокировку записи, т.е. пользователь авторизуется через эту таблицу (там зашифрованные логин/пароль) и блокирует свою запись. Эта блокировка сохраняется до конца сеанса. В этой же таблице можно хранить многие настройки пользователя, права и прочее. В том числе и признак оперативного завершения работы. Такую систему (принудительное завершение работы пользователя) я реализовал в программе на 1С. Работает
|
|
|
|
| |
Пост N: 3
Зарегистрирован: 17.06.10
|
|
Отправлено: 19.07.10 12:08. Заголовок: В 1С, да. А вот в не..
В 1С, да. А вот в неактивной задачке на xHarbour таймер не отрабатывает.Я это решал через tray(в FWH)
|
|
|
|
| |
Пост N: 1807
Зарегистрирован: 17.05.05
|
|
Отправлено: 19.07.10 12:36. Заголовок: fil Что то Вы нет т..
fil Что то Вы нет так делаете парни. Если уж на Clipper удалось это сделать то на X(Harbour) верняк можно сделать. Предположим что в Вашей проге формируется какой то большой отчет , минут на 5 скажем. Если свернуть окно задачи и заниматься какими то другими делами , задача продолжает работать или останавливается ? Если работает , то и таймер должен работать или что Вы там вешали.
|
|
|
|
| постоянный участник
|
Пост N: 1436
Зарегистрирован: 12.09.06
|
|
Отправлено: 19.07.10 13:45. Заголовок: КСС пишет: Для втор..
КСС пишет: цитата: | Для второго нужно доработать программу: создать глобальный таймер, который опрашивает некоторую таблицу, например, один раз в минуту. В этой таблице администратор может устанавливать признак оперативного отключения пользователя и тогда, программа пользователя корректно закрывает все базы данных и интерфейс. Для GUI это довольно просто реализовать, с текстовым режимом посложнее будет... |
| Я это уже сделал на Клипере ! И до сих пор работает ! Переделал на хХарбор тоже работает ! Вопрос ТОЛЬКО один: когда задачу скидываешь на панель задач, то прекращается опрос БАЗЫ выхода.... Как реализовать "снятие" задачи в таком положении ? Может как то Windows таймер опрашивать или еще как нибудь ...
|
|
|
|
| |
Пост N: 4
Зарегистрирован: 17.06.10
|
|
Отправлено: 19.07.10 13:55. Заголовок: Возможно. Я делал em..
Возможно. Я делал embedding 1С из Harbour и хотел по таймеру чего-то там менять в 1С. Не получилось.
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 19.07.10 14:06. Заголовок: Как пробудить клипперную задачу в трее
Можно применить методику дополнительного стороннего агента - программы , которая по своему расписанию или по заданию планировщика Widndows ( раз в минуту) поднимает задачу из трея ( восстанавливает окно) по имени или хендлу окна основной задачи. Когда задача "проснется" , то и завершит себя сама.
|
|
|
|
| |
Пост N: 5
Зарегистрирован: 17.06.10
|
|
Отправлено: 19.07.10 14:19. Заголовок: В смысле посадить в ..
В смысле посадить в tray контролера, который периодически ищет хендл окна главной аппликации и если не активен, то поднимает его ? Или нужно брать хендл задачи, но как тогда определить активна она или нет ?
|
|
|
|
| |
Пост N: 85
Зарегистрирован: 04.12.07
|
|
Отправлено: 19.07.10 14:39. Заголовок: Программа в минимизи..
Программа в минимизированном режиме - это не "заснувшая" программа, и в этом режиме она может и должна работать: формировать отчеты (как тут писали), обрабатывать данные и т.д. Стало быть и таймер должен работать. Сам не проверял, но если это так, то это недоработка Харбора. Надо бы услышать мнение наших гуру.
|
|
|
|
| |
Пост N: 86
Зарегистрирован: 04.12.07
|
|
Отправлено: 19.07.10 14:42. Заголовок: Кстати, чтобы "п..
Кстати, чтобы "поднять" программу из панели задач можно использовать бесплатный AutoIt - превосходный opensource проект как раз для этих целей. Думаю в пару десятков строк можно будет уложиться.
|
|
|
|
| |
Пост 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
|
|
|
|
|
| |
Пост 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 в папку откуда запустил прогу, результат - программа завершилась.
|
|
|
|
| постоянный участник
|
Пост N: 1446
Зарегистрирован: 12.09.06
|
|
Отправлено: 22.07.10 15:35. Заголовок: AlexMyr пишет: Пров..
AlexMyr пишет: цитата: | Проверял на XP и на 98. Запустил, опустил на панель задач, подождал, положил файл exit.txt в папку откуда запустил прогу, результат - программа завершилась. |
| Ну молодец ! Ну спасибо ! Значит можно "снимать" спящую задачу !!!
|
|
|
|
| |
Пост N: 28
Зарегистрирован: 11.06.10
|
|
Отправлено: 22.07.10 16:41. Заголовок: Только что проверил ..
|
|
|
|
| постоянный участник
|
Пост 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 мин. Алгоритм правильный, ищет по индексам... Смущает БЕГУНОК() !
|
|
|
|
| |
Пост 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
|
|
|
|
| |
Пост N: 1820
Зарегистрирован: 17.05.05
|
|
Отправлено: 24.07.10 12:31. Заголовок: Andrey Посмотри тем..
|
|
|
|
| постоянный участник
|
Пост N: 1456
Зарегистрирован: 12.09.06
|
|
Отправлено: 24.07.10 12:40. Заголовок: AlexMyr пишет: Что ..
AlexMyr пишет: цитата: | Что то типа так while lastkey() !=K_ESC |
| Не выйдет ! Обработка базы идет в цикле, и хоть обжимайся клавишу ESC, задача будет выполняться до последней записи !
|
|
|
|
| постоянный участник
|
Пост N: 1457
Зарегистрирован: 12.09.06
|
|
Отправлено: 24.07.10 12:52. Заголовок: Dima пишет: Посмотр..
Dima пишет: Посмотрел. А как для хХарбора переделать ? Да мне только ОДНА функция нужна (выход по ESC) при расчетах по базе !
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 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
|
|
|
|
| постоянный участник
|
Пост N: 1461
Зарегистрирован: 12.09.06
|
|
Отправлено: 24.07.10 15:23. Заголовок: СПАСИБО БОЛЬШОЕ petr..
СПАСИБО БОЛЬШОЕ petr707 !!! Кратко, логично и все понятно .... Буду пробовать к себе в программу "прикручивать"....
|
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 24.07.10 16:34. Заголовок: По поводу обновления..
По поводу обновления бегунка. Известна его длина в символах (пикселах), известно и количество записей в таблице. Значит можно посчитать количество записей, через которое имеет смысл обновлять экран, чтобы не выводить многократно одно и то же.
|
|
|
|
| постоянный участник
|
Пост 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) - координаты начала и конца бегунка. ?
|
|
|
|
| |
Пост 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) это тоже есть.
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 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 СнятиеБегунка() Для универсальности лучше затолкать вычисление в "ОбновлениеБегунка".
|
|
|
|
| Администратор
|
Пост N: 1620
Зарегистрирован: 23.05.05
|
|
Отправлено: 08.08.10 14:28. Заголовок: К слову, средствами ..
К слову, средствами letodb можно отключить клиентскую программу от БД
|
|
|
Ответов - 36
, стр:
1
2
All
[только новые]
|
|