powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / How to run FoxPro EXE-server asynchronously. Eurika!
25 сообщений из 33, страница 1 из 2
How to run FoxPro EXE-server asynchronously. Eurika!
    #38178539
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
And have it send events and callback. Two demo .PRG files presented.
...
Рейтинг: 0 / 0
How to run FoxPro EXE-server asynchronously. Eurika!
    #38178571
piva
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шедевр

Код: vbnet
1.
THIS.BackCaller_o.DoCallBack (JUSTSTEM (_VFP.ServerName), TIME())



Еще Семафоры для синхронизации расплодившихся процессов, и проверка на время исполнения по таймату, а то через 2 часа - мне эти самые данные уже могут быть и не нужны.
...
Рейтинг: 0 / 0
How to run FoxPro EXE-server asynchronously. Eurika!
    #38178742
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rostislav D. Kudryashov

Мне кажется, что код можно немного упростить, объединив в один класс AsyncWorker с классом Worker, класс BackCaller с классом Recipient.
...
Рейтинг: 0 / 0
How to run FoxPro EXE-server asynchronously. Eurika!
    #38178759
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В этом форуме по-русски принято общаться
...
Рейтинг: 0 / 0
How to run FoxPro EXE-server asynchronously. Eurika!
    #38178946
piva
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TВ этом форуме по-русски принято общаться
Соду по мылу ТС - ему не обязательно

Ну если ТС силен в аглицком ему только на http://www.universalthread.com/ там его оценят.
...
Рейтинг: 0 / 0
How to run FoxPro EXE-server asynchronously. Eurika!
    #38178963
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sg12, боюсь, ты сам не пробовал воспользоваться этой идеей. А у меня при переносе метода WorkIt из класса Worker на уровень выше в AsyncServer этот метод не хочет вовремя остановиться и выдаёт сообщение, что куда-то пропал его любимый элемент THIS.BackCaller_o.
Ребята, вы как-нибудь поответственнее к своим словам. Ведь вы все - профессионалы.
Но если уж о чём я жалею, это важный момент реализации DCOM-сервера, который надо бы отразить даже в демонстрашке. Чтоб сервер не захватывал всю память, надо непременно в его метод Init вставить SYS(3050,1,10000000) - ограничить аппетит 10 мегобайтами.
...
Рейтинг: 0 / 0
How to run FoxPro EXE-server asynchronously. Eurika!
    #38178982
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sg12, хоть твоё предложение и невпопад, но спасибо, что моя попытка его реализации натолкнула меня на важную подробность. Если метод WorkIt в верхнем классе AsyncServer, то после выполнения AsyncServer.Destroy управление переходит к неуспевшему остановиться AsyncServer.WorkIt. Это чревато неприятностями, даже если из AsyncServer.Destroy запущено аккуратное закрытие выполняемого задания. Чтобы избежать возобновления работы AsyncServer.WorkIt надо или вставлять в него специально для этого случая какое-то ON ERROR, или просто держать этот метод в отдельном классе, как у меня и сделано. Ведь ON ERROR в WorkIt для персечения его работы это, во-первыхи, извращение, а во-вторых - всё равно всё равно WorkIt останавливается не вовремя.
А если после AsyncServer.Destroy запустится Worker.Destroy, то Worker.WorkIt уже не включится. - Хотя, это я сейчас проверю.
...
Рейтинг: 0 / 0
How to run FoxPro EXE-server asynchronously. Eurika!
    #38178987
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rostislav D. Kudryashov

Не совсем понятно, что не останавливается.
Надо ведь из Worker все перенести в AsyncWorker, все его свойства, а вместо строки
THIS.oWorker = CREATEOBJECT('Worker',m.toBackCaller)
вставить из INIT строку THIS.oBackCaller = m.toBackCaller
Тогда в промежуточном классе Worker отпадет необходимость, в нем ведь нет ничего другого, все будет сидеть в AsyncWorker.
...
Рейтинг: 0 / 0
How to run FoxPro EXE-server asynchronously. Eurika!
    #38178993
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sg12, вместо того, чтоб давать объяснения для дураков, как им ноги переставлять, лучше пришли работающий код.
...
Рейтинг: 0 / 0
How to run FoxPro EXE-server asynchronously. Eurika!
    #38179005
piva
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пошел за попкорном, жду очередного срача в продолжение темы "Общие принципы построения приложения в FoxPro "

ЗЫ Модеру на заметку
Серега, тебе тут спокойно не будет
...
Рейтинг: 0 / 0
How to run FoxPro EXE-server asynchronously. Eurika!
    #38179021
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rostislav D. Kudryashov

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

DEFINE CLASS AsyncWorker as Custom OLEPUBLIC
oStarter = NULL
tWorkTime = DATETIME()
lStopFlag = .T.
oBackCaller = NULL

PROCEDURE StartAsync(m.toBackCaller)
IF ISNULL(THIS.oStarter)
THIS.oBackCaller = m.toBackCaller
THIS.oStarter = CREATEOBJECT('Starter')
ELSE
IF THIS.lStopFlag
THIS.oStarter.INTERVAL = 1000
ENDIF
ENDIF

PROCEDURE StopIt()
THIS.lStopFlag = .T.

FUNCTION GetWorkTime ()
RETURN THIS.tWorkTime

PROCEDURE WorkIt()
THIS.lStopFlag = .F.
DO WHILE !THIS.lStopFlag
IF DATETIME() > THIS.tWorkTime + 5
THIS.tWorkTime = DATETIME()
THIS.oBackCaller.DoCallBack(JUSTSTEM(_VFP.SERVERNAME),TIME())
ENDIF
ENDDO

PROCEDURE Destroy
THIS.StopIt()

ENDDEFINE

piva. Хотите - заведите тему, подтыркивать некрасиво.
...
Рейтинг: 0 / 0
How to run FoxPro EXE-server asynchronously. Eurika!
    #38179024
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pivaПошел за попкорном, жду очередного срача в продолжение темы "Общие принципы построения приложения в FoxPro "
Модератор: Пока нарушений правил форума нет. Весна всегда была трудным периодом.
...
Рейтинг: 0 / 0
How to run FoxPro EXE-server asynchronously. Eurika!
    #38179030
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Докладываю факты. В конец AsyncServer.Destroy, Worker.Destroy, Starter.Timer и Worker.WorkIt вставлена выдача в текстовый файл времени выхода из этих методов.
18:07:50 WorkIt Fini -- Первая интерактивная остановка
18:07:50 Starter.Timer
18:08:13 AsyncServer.Destroy -- Обнуление объекта сервера в приложении клиента
18:08:13 WorkIt Fini
18:08:13 Starter.Timer
18:08:13 Worker.Destroy
Если же в AsyncServer.Destroy не сбрасывать флаг Worker.StopFlag_l, то из-за того, что предотвратить возврат управления в прерванный Worker.WorkIt из AsyncServer.Destroy невозможно, то не завершённый Worker.WorkIt не даст закрыться COM-серверу - он продолжит занимать память без использования ЦПУ.
А вот если поместить WorkIt в AsyncServer, то нормальное завершение этого метода по сбросу флага StopFlag_l уже невозможно, т.к. после выполнения AsyncServer.Destroy этот класс уже не сохраняет условий для выполнения других своих методов.
Ещё раз спасибо коллеге sg12, что он обратил моё внимание на этот скользкий момент прерывания работы запущенного метода. В классе Worker обязательно должен быть метод Destroy!
Но простите меня, выставлять исправленный код я уж не буду.
...
Рейтинг: 0 / 0
How to run FoxPro EXE-server asynchronously. Eurika!
    #38179042
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пожалуй, я погорячился. Ведь "насильственно" прекратить работу метода WorkIt у нас нет фоксовских средств. Т.е. если WorkIt усмотрит через какое-то время после срабатывания AsyncServer.Destroy флаг экстренной остановки StopIt, то этот флаг и послужит ему сигналом аккуратного заметания следов незаконченной работы. И метод Worker.Destroy для этой цели не нужен.
А чтоб мой демонстратор был пореалистичнее, в нём надо дать возможность штатного завершения методу WorkIt - например, по интервалу времени.
Пожалуй, повторю выкладку скорректированной редакции.
...
Рейтинг: 0 / 0
How to run FoxPro EXE-server asynchronously. Eurika!
    #38179052
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sg12, тебе "непонятно" (10.03.2013 17:10, 14031939), а ты бы подумал, почему первые два запуска перемещённый по твоему рецепту метод AsyncServer.WorkIt работает без запинки, а после срабатывания AsyncServer.Destroy - уже не может. Как же, по-твоему, этот метод работал "до того", если я, по твоему предположению, понаделал каких-то ошибок в реализации твоего "мудрого" совета?
Стыдно лепить в ленту нафантазированные предположения!
...
Рейтинг: 0 / 0
How to run FoxPro EXE-server asynchronously. Eurika!
    #38179054
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rostislav D. Kudryashov

По моему, в Workit лучше обрабатывать возврат, чем работать через его сомнительное зависание.
Что-то вроде:
llSuccess = THIS.oBackCaller.DoCallBack()
IF llSuccess
...
Или где-то создавать еще одно свойство, что-то вроде .lSuccess

Второй код

PROCEDURE RunAsyncServer
LPARAMETERS m.tcServerName
m.tcServerName = IIF(EMPTY (m.tcServerName),'LocalHost',tcServerName)

LOCAL m.loBac, m.lnBind, m.loAsy, m.lcMsg

m.loBac = CREATEOBJECT('BackCaller')
m.lnBind = BINDEVENT(m.loBac,'cCurTime',m.loBac,'HandleIt')
И т.д.

DEFINE CLASS BackCaller AS Session
oRecipient = NULL
cCurTime = ''

PROCEDURE Init(m.toRecipient)
THIS.oRecipient = m.toRecipient

PROCEDURE DoCallBack(m.tcSender, m.tcTime)
LOCAL m.lnCnt, m.ltDT
FOR m.lnCnt = 1 TO 3
m.ltDT = DATETIME()
DO WHILE DATETIME() < m.ltDT + 1
ENDDO
THIS.cCurTime = m.tcTime
THIS.AcceptIt('From ' + m.tcSender + ' ' + m.tcTime)
ENDFOR

PROCEDURE AcceptIt (m.tcMessage)
? 'AcceptIt ' + m.tcMessage

PROCEDURE HandleIt ()
LOCAL m.Ev_la[1]
AEVENTS(m.laEv,0)
? 'HandleIt ' + m.laEv[1].NAME + '.' + m.laEv[2] + ' ' + TRANSFORM(m.laEv[2])

ENDDEFINE && BackCaller
...
Рейтинг: 0 / 0
How to run FoxPro EXE-server asynchronously. Eurika!
    #38179055
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rostislav D. Kudryashov
Код: sql
1.
2.
3.
PROCEDURE Timer
THIS.Interval = 0
THIS.Worker_o.WorkIt()


Стандартная ошибка при работе с таймерами. Типа мы его остановили и он обязан остановиться, на самом деле обязан больше не срабатывать. Но если он уже успел несколько раз сработать, а запуска метода Timer() по этим сработкам не произошло, то произойдет и этот код отработает несколько раз.
Может несколько раз сработать. Добавь в начале:
Код: sql
1.
2.
3.
if THIS.Interval = 0
  return
endif



PS Удобнее останавливать Timer.Enabled = .F., т.к. Interval не меняется и не надо задавать его в куче мест для повторного запуска.
...
Рейтинг: 0 / 0
How to run FoxPro EXE-server asynchronously. Eurika!
    #38179062
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rostislav D. Kudryashovто не завершённый Worker.WorkIt не даст закрыться COM-серверу - он продолжит занимать память без использования ЦПУ.


Это уже ошибка - один объект держит другой объект, может дойти и до трех пальцев.
Ошибки должны обрабатываться программно.
Как и закрытие открытых объектов.
...
Рейтинг: 0 / 0
How to run FoxPro EXE-server asynchronously. Eurika!
    #38179064
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и Timer.Interval = 1000 это тормоз. Ждем секунду чтобы начать? Зачем?
Надо чтоб работало при Timer.Interval = 1
...
Рейтинг: 0 / 0
How to run FoxPro EXE-server asynchronously. Eurika!
    #38179079
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, а ведь это ты гонишь какое-то духовидство.
Запускаем программу TestTimer.PRG и смотрим её выдачу TestTimer.LOG.
Реальными фактами твои предположения не подтверждаются, значит - нафантазировал. Ай-я-яй.
TestTimer.PRG
SET TEXTMERGE ON
SET TEXTMERGE TO TestTimer.LOG
Timer_lo = NEWOBJECT ('MyTimer')
GETFILE() && We'll have a walk, while MyTimer's working
\ <<TIME()>> Basta
SET TEXTMERGE TO
SET TEXTMERGE OFF
*****************************
DEFINE CLASS MyTimer AS Timer
Interval = 2000
Enabled = .T.
PROCEDURE Timer
\ <<TIME()>> <<PROGRAM()>>
THIS.Interval = 0
ENDPROC && MyTimer.Timer
ENDDEFINE && MyTimer

TestTimer.LOG
19:21:17 MYTIMER.TIMER
19:21:32 Basta
...
Рейтинг: 0 / 0
How to run FoxPro EXE-server asynchronously. Eurika!
    #38179084
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rostislav D. KudryashovDima T, а ведь это ты гонишь
Не хочу ничего доказывать, наступишь на эти грабли, сам поймешь о чем я писал.
...
Рейтинг: 0 / 0
How to run FoxPro EXE-server asynchronously. Eurika!
    #38179088
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, Для большей наглядности и доказательности. Нет такой стандартной ошибки, есть у твоя стандартная выдумка - не лезть за словом ни в карман, ни в эксперимент. Духовидство, или проще, застарелые предрассудки
TestTimer.PRG
SET TEXTMERGE ON
SET TEXTMERGE TO TestTimer.LOG
\ <<TIME()>> Starting
Timer_lo = NEWOBJECT ('MyTimer')
GETFILE() && We'll have a walk, while MyTimer's working
\ <<TIME()>> Basta
SET TEXTMERGE TO
SET TEXTMERGE OFF
*****************************
DEFINE CLASS MyTimer AS Timer
Interval = 2000
Enabled = .T.
PROCEDURE Timer
\ <<TIME()>> <<PROGRAM()>>
THIS.Interval = 0
m.t0 = SECONDS()
DO WHILE SECONDS() < m.t0 + 10
ENDDO
\ <<TIME()>> After 10 seconds
ENDPROC && MyTimer.Timer
ENDDEFINE && MyTimer

TestTimer.LOG
19:36:18 Starting
19:36:20 MYTIMER.TIMER
19:36:30 After 10 seconds
19:36:44 Basta
...
Рейтинг: 0 / 0
How to run FoxPro EXE-server asynchronously. Eurika!
    #38179091
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запусти этот код
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
clear

public goTimer
goTimer = NEWOBJECT('MyTimer')
inkey(1)

*****************************
DEFINE CLASS MyTimer AS Timer
Interval = 1
Enabled = .T.
nCount = 0
PROCEDURE Timer
THIS.Interval = 0
This.nCount = This.nCount + 1
? This.nCount
ENDPROC && MyTimer.Timer
ENDDEFINE && MyTimer
...
Рейтинг: 0 / 0
How to run FoxPro EXE-server asynchronously. Eurika!
    #38179094
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Итак, в эксперименте родилось новое знание, недоступное ранее без влезания в "асинхронность".
После срабатывания метода Class.Destory никакому другому методу на этаже этого класса уже работать не позволено.
А вот для Member-классов, такая возможность предоставлена - их методы Destroy вызываются последовательно по цепочке вложенности Member-ship.
...
Рейтинг: 0 / 0
How to run FoxPro EXE-server asynchronously. Eurika!
    #38179100
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, этот пример надуманный, к делу не относится. Значение Interval = 1 - одна милли-секунда - это погрешность срабатывания таймера. Использовать такие значения - просто техническая неграмотность.
В моём примере с AsyncServer значение Starter.Interval = 1000 - 1 cек, реалистично.
Так твои фокусы тебя не спасают, и sg12 - тоже.
...
Рейтинг: 0 / 0
25 сообщений из 33, страница 1 из 2
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / How to run FoxPro EXE-server asynchronously. Eurika!
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]