Добрый день! Проясните, пожалуйста алгоритм работы. Работает скрипт, происходит событие. Скрипт прерывается и включается обработка? А потом скрипт продолжает работу? Как сделать так, чтобы пока, например, функция не выполнится, обработка не выполнялась? В тех случаях, когда мне так надо. Бывают случаи, например когда нужно снять заявки. Скрипт начинает их удалять, одну удалил, произошло событие - снятие, и скрипт может сбиться, потому что данные для второго удаления уже изменились, а мне надо, чтобы первый "слепок" данных не менялся.
Viktor MMM пишет: Работает скрипт, происходит событие. Скрипт прерывается и включается обработка? А потом скрипт продолжает работу?
Все события работают в основном потоке терминала. таким образом пока что-то делается в каком-то событии, в терминале ничего не происходит. Он даже может повиснуть.
Цитата
Viktor MMM пишет: Как сделать так, чтобы пока, например, функция не выполнится, обработка не выполнялась? В тех случаях, когда мне так надо.
Этот вопрос совершенно не понятен. Вы имеете в виду, чтобы "пока код в событии работает, функция main останавливала работу"?
Сергей, спасибо что отозвались. Нет. Происходит событие. Вы говорите, что терминал подвисает и начинает его обрабатывать. Мне же надо, чтобы при возникновении события сначала доработала какая -то моя функция, а потом уже пошла обработка события. Причем по моему выбору. В каких-то для меня критичных местах. То есть не код в событии продолжал работать, а, например, тот же main. Доработал бы до какого-то места, а потом бы разрешил обработать событие. Это возможно?
Viktor MMM пишет: Происходит событие. Вы говорите, что терминал подвисает и начинает его обрабатывать. Мне же надо, чтобы при возникновении события сначала доработала какая -то моя функция, а потом уже пошла обработка события. Причем по моему выбору. В каких-то для меня критичных местах. То есть не код в событии продолжал работать, а, например, тот же main. Доработал бы до какого-то места, а потом бы разрешил обработать событие. Это возможно?
Вы можете установить на входе и выходе своей функции какую-нибудь переменную флаг, и пропускать обработку событий пока флаг не примет нужного значение.
Цитата
Viktor MMM пишет: я мог бы конечно отсечь влияние событий глобальным флагом, но хотелось бы, чтоб событие не терялось а в очередь вставало и отработало в итоге.
Это нельзя сделать, так как появление очереди приведет к полному отказу в работе терминала.
Sergey Gorokhov пишет: Это нельзя сделать, так как появление очереди приведет к полному отказу в работе терминала.
Вроде же разрабы говорили, что события встают в очередь и хронология не меняется. Значит очередь эта возникает. Что подразумеваете под "полным отказом"? просто подвисает?
Виктор, На Ваш вопрос, можно ли застопроприть событие так, чтобы накопиться очередь, а потом она продолжилась, то ответ можно, включив бесконечный цикл в событии. Но это приведет к зависанию всего терминала. Если Вам нужно обрабатывать данные которые поступили за время работы функции main без зависаний, используйте стороннее хранилище поступающих данных
а вообще - Michael Bulychev мог бы, действительно и подробно расписать механизм работы событий в квике. Уверен, что это никак бы не отразилось на "коммерческой тайне", а наоборот - повысило бы понимание этого вопроса для пользователей и сократило бы кучу "глупых" вопросов и "догадок" на форуме. А также, уменьшило бы их стремление получить ответы на свои вопросы другими путями.
Добрый день. В вашем случае можно данные из функций обратного вызова (OnOrder, OnTrade ...) складывать в одну или несколько очередей и обрабатывать данные в main(). В этом случае Вы сами будете контролировать порядок обработки данных.
sam063rus пишет: а вообще - Michael Bulychev мог бы, действительно и подробно расписать механизм работы событий в квике. Уверен, что это никак бы не отразилось на "коммерческой тайне", а наоборот - повысило бы понимание этого вопроса для пользователей и сократило бы кучу "глупых" вопросов и "догадок" на форуме. А также, уменьшило бы их стремление получить ответы на свои вопросы другими путями.
Добрый день. Вроде уже все было описано достаточно подробно. Интересует что-то конкретное?
Michael Bulychev пишет: Добрый день. В вашем случае можно данные из функций обратного вызова (OnOrder, OnTrade ...) складывать в одну или несколько очередей и обрабатывать данные в main(). В этом случае Вы сами будете контролировать порядок обработки данных.
День добрый, Михаил! Не могли бы Вы натолкнуть на способ такого складывания? sam063rus, спасибо, но корутины пока выше моих возможностей.
Серж пишет: Sergey Gorokhov , отметьте также об отсутствии потокобезопасности предложенного вами способа. А то ведь ещё один человек по этим "граблям пройдётся".
да ладно, а как же Потокобезопасные функции для работы с таблицами Lua
Цитата
Одновременная работа с таблицами из функций обратного вызова скрипта и функции main() может приводить к неопределенным ситуациям. Для решения этой проблемы qlua.dll предоставляет потокобезопасные аналоги стандартных функций Lua.
Формат вызова потокобезопасной функции совпадает с форматом вызова аналогичной стандартной функции Lua.
В таблице представлены стандартные функции Lua и соответствующие им потокобезопасные аналоги:
Стандартная функция Lua concat remove insert sort
Потокобезопасная функция sconcat sremove sinsert ssort