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




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


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

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

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

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


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




Пост 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 час. Хитов сегодня: 33
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет