powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / How to run FoxPro EXE-server asynchronously. Eurika!
33 сообщений из 33, показаны все 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
How to run FoxPro EXE-server asynchronously. Eurika!
    #38179105
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rostislav D. KudryashovЧтобы избежать возобновления работы AsyncServer.WorkIt надо или вставлять в него специально для этого случая какое-то ON ERROR, или просто держать этот метод в отдельном классе, как у меня и сделано. Ведь ON ERROR в WorkIt для персечения его работы это, во-первыхи, извращение, а во-вторых - всё равно всё равно WorkIt останавливается не вовремя.


Кроме ON ERROR есть еще COMRETURNERROR() и TRY ... ENDTRY, но это вы уж сами.

Из Destroy обычно вызывается процедура закрытия программы, как и из обработчика ошибок, OnShutdown и др.
...
Рейтинг: 0 / 0
How to run FoxPro EXE-server asynchronously. Eurika!
    #38179109
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rostislav D. Kudryashovодна милли-секунда - это погрешность срабатывания таймера.
Сам то понял что написал? таймер это не аналоговый прибор с погрешностями.
Кстати одна миллисекунда это очень много времени. Слабенький процессор в 1,5 ГГц выполняет до 1,5 млн. операций за это время.
Rostislav D. KudryashovИспользовать такие значения - просто техническая неграмотность.
Быстро работающий код это неграмотность. Забавно.
Желаю удачи в написании тормозов. Будет глючить - увеличь интервал
...
Рейтинг: 0 / 0
How to run FoxPro EXE-server asynchronously. Eurika!
    #38179214
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, a prpos на твой PS
авторPS Удобнее останавливать Timer.Enabled = .F.
На моём компе, если запустить Timer с Interval < 38 и при первом срабатывании в методе Timer поставить THIS.Interval = 0, то и установка THIS.Enabled = .F. не спасает от серии последующих срабатываний таймера.
Похоже, это результат разности между скоростью реализации таймера средствами WinAPI и скоростью интерпретации операторов FoxPro. Пока FoxPro перешагнёт одну строку, WinAPI крутанёт таймер несколько десятков раз. Так что рекомендованный тобой "замок" по свойствам Timer на входе самое верное.
...
Рейтинг: 0 / 0
How to run FoxPro EXE-server asynchronously. Eurika!
    #38179217
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, a prpos на твой PS
Dima TPS Удобнее останавливать Timer.Enabled = .F.
На моём компе, если запустить Timer с Interval < 38 и при первом срабатывании в методе Timer поставить THIS.Interval = 0, то и установка THIS.Enabled = .F. не спасает от серии последующих срабатываний таймера.
Похоже, это результат разности между скоростью реализации таймера средствами WinAPI и скоростью интерпретации операторов FoxPro. Пока FoxPro перешагнёт одну строку, WinAPI крутанёт таймер несколько десятков раз. Так что рекомендованный тобой "замок" по свойствам Timer на входе самое верное.
...
Рейтинг: 0 / 0
How to run FoxPro EXE-server asynchronously. Eurika!
    #38179224
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sg12, ну вот ты пытаешься хоть к чему-то прицепить свои "опровержения", а ведь речь о том, что ты не раскаялся в своём предложении поднять метод WorkIt из Member-класса Worker в контейнер для этого класса - класс AsyncWorker.
Криминал в твоём предложении тот, что если AsyncWorker.Destroy сработает во время работы метода WorkIt, то этот метод всё равно получит управление сразу после выхода из AsyncWorker.Destroy. Но все члены класса AsyncWorker для метода WorkIt станут недоступны. Так что если WorkIt оказался в классе AsyncWorker, то неизбежен сбой при обращении из WorkIt к членам AsyncWorker.

Пока не осознаешь свою ошибку, больше сюда не пиши.
...
Рейтинг: 0 / 0
How to run FoxPro EXE-server asynchronously. Eurika!
    #38179227
Еще нужно обязательно делать маппинг таблиц на память, перед использованием. Create, так сказать, FileMappingDBF и т.д..
...
Рейтинг: 0 / 0
How to run FoxPro EXE-server asynchronously. Eurika!
    #38179317
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rostislav D. KudryashovDima T, a prpos на твой PS
авторPS Удобнее останавливать Timer.Enabled = .F.
На моём компе, если запустить Timer с Interval < 38 и при первом срабатывании в методе Timer поставить THIS.Interval = 0, то и установка THIS.Enabled = .F. не спасает от серии последующих срабатываний таймера.
Похоже, это результат разности между скоростью реализации таймера средствами WinAPI и скоростью интерпретации операторов FoxPro. Пока FoxPro перешагнёт одну строку, WinAPI крутанёт таймер несколько десятков раз. Так что рекомендованный тобой "замок" по свойствам Timer на входе самое верное.
Я и не говорил что Enabled = .F. спасет от повторов. От повторов спасет только проверка что таймер уже остановлен. Пример выше я давал.
Enabled = .F. только упрощает код. Например у тебя несколько мест где прописано .Interval = 1000, если ты 1000 захочешь сменить - надо будет выискивать все места. При использовании Enabled интервал будет указан только в одном месте.
Что касается твоих догадок, то Interval < 38 частный случай для конкретного кода на конкретном компе. Может быть больше, может меньше. Если бы была рекомендуемая константа - написали бы в хэлпе.

В твоем случае таймер только для организации асинхронности и никаких доп.пауз не требуется, значит ему надо Interval = 1 чтобы полезный код начал выполняться как можно быстрее.

Причина в следующем: Timer при включении дает команду виндовсу ( SetTimer() ) слать окну фокса сообщение WM_TIMER, которое с заданной периодичностью добавляется в очередь сообщений и обрабатывается по мере возможности, т.е. в момент остановки таких сообщений может быть несколько и они все будут обработаны фоксом.
...
Рейтинг: 0 / 0
How to run FoxPro EXE-server asynchronously. Eurika!
    #38181064
RX032
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не ... мозги. Проблема решается просто. Либо через DCOM сервер (позднее связывание) ,либо через поточную DLL/FLL.
...
Рейтинг: 0 / 0
33 сообщений из 33, показаны все 2 страниц
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / How to run FoxPro EXE-server asynchronously. Eurika!
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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