Добрый день! Проясните, пожалуйста алгоритм работы. Работает скрипт, происходит событие. Скрипт прерывается и включается обработка? А потом скрипт продолжает работу? Как сделать так, чтобы пока, например, функция не выполнится, обработка не выполнялась? В тех случаях, когда мне так надо. Бывают случаи, например когда нужно снять заявки. Скрипт начинает их удалять, одну удалил, произошло событие - снятие, и скрипт может сбиться, потому что данные для второго удаления уже изменились, а мне надо, чтобы первый "слепок" данных не менялся.
Пользователь
Сообщений: Регистрация: 23.01.2015
15.04.2015 13:20:47
Здравствуйте,
Цитата
Viktor MMM пишет: Работает скрипт, происходит событие. Скрипт прерывается и включается обработка? А потом скрипт продолжает работу?
Все события работают в основном потоке терминала. таким образом пока что-то делается в каком-то событии, в терминале ничего не происходит. Он даже может повиснуть.
Цитата
Viktor MMM пишет: Как сделать так, чтобы пока, например, функция не выполнится, обработка не выполнялась? В тех случаях, когда мне так надо.
Этот вопрос совершенно не понятен. Вы имеете в виду, чтобы "пока код в событии работает, функция main останавливала работу"?
Пользователь
Сообщений: Регистрация: 04.03.2015
15.04.2015 13:48:00
Сергей, спасибо что отозвались. Нет. Происходит событие. Вы говорите, что терминал подвисает и начинает его обрабатывать. Мне же надо, чтобы при возникновении события сначала доработала какая -то моя функция, а потом уже пошла обработка события. Причем по моему выбору. В каких-то для меня критичных местах. То есть не код в событии продолжал работать, а, например, тот же main. Доработал бы до какого-то места, а потом бы разрешил обработать событие. Это возможно?
Пользователь
Сообщений: Регистрация: 04.03.2015
15.04.2015 13:52:21
я мог бы конечно отсечь влияние событий глобальным флагом, но хотелось бы, чтоб событие не терялось а в очередь вставало и отработало в итоге.
Пользователь
Сообщений: Регистрация: 23.01.2015
15.04.2015 13:56:16
Цитата
Viktor MMM пишет: Происходит событие. Вы говорите, что терминал подвисает и начинает его обрабатывать. Мне же надо, чтобы при возникновении события сначала доработала какая -то моя функция, а потом уже пошла обработка события. Причем по моему выбору. В каких-то для меня критичных местах. То есть не код в событии продолжал работать, а, например, тот же main. Доработал бы до какого-то места, а потом бы разрешил обработать событие. Это возможно?
Вы можете установить на входе и выходе своей функции какую-нибудь переменную флаг, и пропускать обработку событий пока флаг не примет нужного значение.
Цитата
Viktor MMM пишет: я мог бы конечно отсечь влияние событий глобальным флагом, но хотелось бы, чтоб событие не терялось а в очередь вставало и отработало в итоге.
Это нельзя сделать, так как появление очереди приведет к полному отказу в работе терминала.
Пользователь
Сообщений: Регистрация: 04.03.2015
15.04.2015 13:59:02
Цитата
Sergey Gorokhov пишет: Это нельзя сделать, так как появление очереди приведет к полному отказу в работе терминала.
Вроде же разрабы говорили, что события встают в очередь и хронология не меняется. Значит очередь эта возникает. Что подразумеваете под "полным отказом"? просто подвисает?
Пользователь
Сообщений: Регистрация: 23.01.2015
15.04.2015 14:13:00
Виктор, На Ваш вопрос, можно ли застопроприть событие так, чтобы накопиться очередь, а потом она продолжилась, то ответ можно, включив бесконечный цикл в событии. Но это приведет к зависанию всего терминала. Если Вам нужно обрабатывать данные которые поступили за время работы функции main без зависаний, используйте стороннее хранилище поступающих данных
Пользователь
Сообщений: Регистрация: 01.02.2015
15.04.2015 14:25:09
приведите весь код.
Цитата
Sergey Gorokhov пишет: Мне же надо, чтобы при возникновении события сначала доработала какая -то моя функция, а потом уже пошла обработка события.
используйте корутины.
Цитата
Viktor MMM пишет: Работает скрипт, происходит событие.
чьё событие? квиковский коллбек? или ваш?
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
15.04.2015 14:28:39
Цитата
Viktor MMM пишет: Вроде же разрабы говорили, что события встают в очередь и хронология не меняется.
По поводу очереди событий .
Надо делать так, как надо. А как не надо - делать не надо.
Пользователь
Сообщений: Регистрация: 01.02.2015
15.04.2015 14:31:20
а вообще - мог бы, действительно и подробно расписать механизм работы событий в квике. Уверен, что это никак бы не отразилось на "коммерческой тайне", а наоборот - повысило бы понимание этого вопроса для пользователей и сократило бы кучу "глупых" вопросов и "догадок" на форуме. А также, уменьшило бы их стремление получить ответы на свои вопросы другими путями.
Michael Bulychev
Гость
15.04.2015 16:34:22
Добрый день. В вашем случае можно данные из функций обратного вызова (OnOrder, OnTrade ...) складывать в одну или несколько очередей и обрабатывать данные в main(). В этом случае Вы сами будете контролировать порядок обработки данных.
Michael Bulychev
Гость
15.04.2015 16:35:38
Цитата
sam063rus пишет: а вообще - мог бы, действительно и подробно расписать механизм работы событий в квике. Уверен, что это никак бы не отразилось на "коммерческой тайне", а наоборот - повысило бы понимание этого вопроса для пользователей и сократило бы кучу "глупых" вопросов и "догадок" на форуме. А также, уменьшило бы их стремление получить ответы на свои вопросы другими путями.
Добрый день. Вроде уже все было описано достаточно подробно. Интересует что-то конкретное?
Пользователь
Сообщений: Регистрация: 04.03.2015
15.04.2015 17:48:11
Цитата
Michael Bulychev пишет: Добрый день. В вашем случае можно данные из функций обратного вызова (OnOrder, OnTrade ...) складывать в одну или несколько очередей и обрабатывать данные в main(). В этом случае Вы сами будете контролировать порядок обработки данных.
День добрый, Михаил! Не могли бы Вы натолкнуть на способ такого складывания? sam063rus, спасибо, но корутины пока выше моих возможностей.
Пользователь
Сообщений: Регистрация: 23.01.2015
15.04.2015 17:52:09
Цитата
Viktor MMM пишет: Не могли бы Вы натолкнуть на способ такого складывания?
Имеется в виду создать таблице t={} и добавлять в нее элементы которые не успели обработать. А после обработки очищать ее.
Пользователь
Сообщений: Регистрация: 04.03.2015
15.04.2015 17:59:24
Понял, попробую так, спасибо.
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
15.04.2015 18:30:29
Цитата
Sergey Gorokhov пишет: Имеется в виду создать таблице t={} и добавлять в нее элементы которые не успели обработать. А после обработки очищать ее.
Sergey Gorokhov, отметьте также об отсутствии потокобезопасности предложенного вами способа. А то ведь ещё один человек по этим "граблям пройдётся".
Надо делать так, как надо. А как не надо - делать не надо.
Пользователь
Сообщений: Регистрация: 23.01.2015
15.04.2015 18:33:18
Цитата
Серж пишет: Sergey Gorokhov , отметьте также об отсутствии потокобезопасности предложенного вами способа. А то ведь ещё один человек по этим "граблям пройдётся".
да ладно, а как же Потокобезопасные функции для работы с таблицами Lua
Цитата
Одновременная работа с таблицами из функций обратного вызова скрипта и функции main() может приводить к неопределенным ситуациям. Для решения этой проблемы qlua.dll предоставляет потокобезопасные аналоги стандартных функций Lua.
Формат вызова потокобезопасной функции совпадает с форматом вызова аналогичной стандартной функции Lua.
В таблице представлены стандартные функции Lua и соответствующие им потокобезопасные аналоги:
Стандартная функция Lua concat remove insert sort
Потокобезопасная функция sconcat sremove sinsert ssort