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

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

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

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

Dima: Andrey Только идея (черновая , ногами не пинать ) , совершенствуй. [pre2] #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 [/pre2] PS Clipper

AlexMyr: 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 в папку откуда запустил прогу, результат - программа завершилась.

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


AlexMyr: Только что проверил и для clipper - тоже работает. Но на 98 в свойствах для exe файла можна поставить опцию для фонового режима - полная остановка, тогда уже не работает. Для exe файла собраного harbour - такой опции нет (хотя может не показывает. не копал сильно). Вот.

Andrey: С одним вопросом разобрались.... Спасибо всем большое ! Теперь на повестке стоит другой вопрос. Имеем расчет по базе. БЕГУНОК("Идет расчет") FOR nI := 1 TO ORDKEYCOUNT() БЕГУНОК(, nI,ORDKEYCOUNT()) ORDKEYGOTO(nI) // Расчеты NEXT СНЯТЬБЕГУНОК() Как сделать, чтоб ко клавише допустим ESC можно было "выйти" или "прервать" расчеты ? Если вставить внутрь цикла конструкцию типа: nKey := INKEY() IF nKey == K_ESC EXIT ENDIF То расчеты иногда ДОЛЬШЕ считаются, т.е. комп "подтормаживает" ! Кто и как поступают в данной ситуации ? И второй вопрос: Нужно ли отображать "бегунок" на каждую запись, или сделать показ допустим через 100 записей, для УСКОРЕНИЯ обсчета базы ? Использую терминал GTWVT ! В нем вывод на экран "тормозит" выполнение задачи ? Почему спрашиваю ? Перешел на хХарбор скорость устраивала, сейчас хочется быстрей ! Расчет по базе 30 тыс.записей, делаю разноску. Затрачивается примерно 30 мин. Алгоритм правильный, ищет по индексам... Смущает БЕГУНОК() !

AlexMyr: Что то типа так while lastkey() !=K_ESC БЕГУНОК("Идет расчет") FOR nI := 1 TO ORDKEYCOUNT() БЕГУНОК(, nI,ORDKEYCOUNT()) ORDKEYGOTO(nI) // Расчеты NEXT СНЯТЬБЕГУНОК() end

Dima: Andrey Посмотри тему http://clipper.borda.ru/?1-0-0-00000304-000-10001-0-1158314202 и ответы Suv2

Andrey: AlexMyr пишет: Что то типа так while lastkey() !=K_ESC Не выйдет ! Обработка базы идет в цикле, и хоть обжимайся клавишу ESC, задача будет выполняться до последней записи !

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

petr707: 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

Andrey: СПАСИБО БОЛЬШОЕ petr707 !!! Кратко, логично и все понятно .... Буду пробовать к себе в программу "прикручивать"....

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

Andrey: wad1 пишет: Значит можно посчитать количество записей, через которое имеет смысл обновлять экран, чтобы не выводить многократно одно и то же. Хорошая идея ! А как реализовать ? aDim:=Бегунок("Идет расчет") FOR nI := 1 TO nRecAll ОбновлениеБегунка(aDim,nI,nRecAll) NEXT СнятиеБегунка() ///////////////////////// ОбновлениеБегунка(aDim,nI,nRecAll) aDim(y,x,y2,x2) - координаты начала и конца бегунка. ?

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

wad1: Примерно так: 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 СнятиеБегунка() Для универсальности лучше затолкать вычисление в "ОбновлениеБегунка".

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



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