SetTableNotificationCallback

Страницы: 1
RSS
SetTableNotificationCallback
 
Добрый день

Особенность работы колбеков от окошек скрипта. Последовательность действий.


Пишем скрипт, который открывает окно, назначает колбеки и после этого делает некоррекную операцию, типа индексирует значение nil

Запускаем. Скрипт отрисовывает на экране окно и падает. Как и планировалось.

Окно остается на экране. (само по себе не гуд)

Убираем ошибку в скрипте, запускаем скрипт снова

Теперь на экране 2 одинаковых окна

Пробуем закрыть "мертвое" окно, оставшееся от первого запуска скрипта (или какое-то другое действие с ним)

В скрипте, который работает (в котором нет ошибки) мы получаем колбек от "мертвого" окна, не являющегося собственностью скрипта.
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Я писал об этом эффекте: http://forum-archive.quik.ru/forum/lua/124592/124756/
После некоторых раздумий пришёл к выводу, что эту особенность можно использовать для работы со "старым" окном после перезапуска скрипта.   :)  
Цитата
s_mike@rambler.ru пишет:
Пробуем закрыть "мертвое" окно, оставшееся от первого запуска скрипта (или какое-то другое действие с ним)
Можно просто закрыть "мертвое" окно перед повторным запуском скрипта   ;-)  

Если не предусмотрено закрытие окна при штатной остановке скрипта и работа со "старым" окном после этого не требуется, то я обычно удаляю колбек:
Код
SetTableNotificationCallback(hID, function()end) 
Надо делать так, как надо. А как не надо - делать не надо.
 
К каждой проблеме надо подходить творчески.

Если окно не закрывается, попробуйте выключить монитор.
Если и после этого не закрывается,
то выключайте свет и ложитесь спать под теплое одеяло.
--------------------------------------------------
Мужайтесь! Запад нам поможет!
 
Цитата
s_mike@rambler.ru пишет:
Добрый день

Особенность работы колбеков от окошек скрипта. Последовательность действий.


Пишем скрипт, который открывает окно, назначает колбеки и после этого делает некоррекную операцию, типа индексирует значение nil

Запускаем. Скрипт отрисовывает на экране окно и падает. Как и планировалось.

Окно остается на экране. (само по себе не гуд)

Убираем ошибку в скрипте, запускаем скрипт снова

Теперь на экране 2 одинаковых окна

Пробуем закрыть "мертвое" окно, оставшееся от первого запуска скрипта (или какое-то другое действие с ним)

В скрипте, который работает (в котором нет ошибки) мы получаем колбек от "мертвого" окна, не являющегося собственностью скрипта.
Добрый день.
Михаил, дайте скрипт на котором тестировали.
 
Цитата
Сергей Горохов, ARQA Technologies пишет:
Это штатный функционал.
Надо делать так, как надо. А как не надо - делать не надо.
 
Цитата
Michael Bulychev пишет:
Цитата
s_mike@rambler.ru пишет:
Добрый день

Особенность работы колбеков от окошек скрипта. Последовательность действий.


Пишем скрипт, который открывает окно, назначает колбеки и после этого делает некоррекную операцию, типа индексирует значение nil

Запускаем. Скрипт отрисовывает на экране окно и падает. Как и планировалось.

Окно остается на экране. (само по себе не гуд)

Убираем ошибку в скрипте, запускаем скрипт снова

Теперь на экране 2 одинаковых окна

Пробуем закрыть "мертвое" окно, оставшееся от первого запуска скрипта (или какое-то другое действие с ним)

В скрипте, который работает (в котором нет ошибки) мы получаем колбек от "мертвого" окна, не являющегося собственностью скрипта.
Добрый день.
Михаил, дайте скрипт на котором тестировали.
Михаил, здравствуйте.

Собственно, тестирование settablenotif  я не занимался, поэтому тестового скрипта, как такового, нет. При построении очередного робота я обратил внимание на лишние колбеки, которые портили логику. Я отлогировал результаты оконного колбекв и увидел (по id), что они приходят от "мертвого" окна.

В частности, приходит event24 при его закрытии.

Если очень нужно, написать скрипт, которые иллюстрирует проблему, несложно. Думаю, у вас это займет ничуть не больше времени, чем у меня.
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Добрый день.
Вся штука в том, что окно привязано не к текущему инстансу VM Lua, а к загруженному скрипту. Как только скрипт снова запускается, то он начнет получать нотификацию от своих ранее созданных окон. Чтоб бы избежать такого придется закрывать все окна созданные скриптом после его остановки.
Можно рассмотреть такое пожелание если оно устроит пользователей.
 
Цитата
Michael Bulychev пишет:
Вся штука в том, что окно привязано не к текущему инстансу VM Lua, а к загруженному скрипту.
а разве для каждого загруженного скрипта не создаётся виртуальная машина?
т.е. получается, остановив скрипт - мы на самом деле ничего не останавливаем, а закрываем дочерний стейт?
 
Цитата
sam063rus пишет:
Цитата
Michael Bulychev пишет:
Вся штука в том, что окно привязано не к текущему инстансу VM Lua, а к загруженному скрипту.
а разве для каждого загруженного скрипта не создаётся виртуальная машина?
т.е. получается, остановив скрипт - мы на самом деле ничего не останавливаем, а закрываем дочерний стейт?
Создается. Что такое дочерний стейт я не понимаю. В связи с какой проблемой подобный вопрос?
 
Цитата
Michael Bulychev пишет:
Что такое дочерний стейт я не понимаю.
имеется ввиду контекст созданный lua_newthread. просто по Вашим словам можно именно так понять, что закрывая скрипт - мы на самом деле не уничтожаем его VM.
 
Цитата
Michael Bulychev пишет:
Чтоб бы избежать такого придется закрывать все окна созданные скриптом после его остановки.
Можно рассмотреть такое пожелание если оно устроит пользователей.
Ну вот этого уж точно не стоит делать: если пользователь сам не позаботился о закрытии окна при завершении скрипта, то значит так нужно.
Чтобы не получать колбеки от "старых" окон можно поступить, как я писал выше:
Цитата
Серж пишет:
Если не предусмотрено закрытие окна при штатной остановке скрипта и работа со "старым" окном после этого не требуется, то я обычно удаляю колбек:
Код
 SetTableNotificationCallback(hID, function()end)  
Надо делать так, как надо. А как не надо - делать не надо.
 
Цитата
sam063rus пишет:
Цитата
Michael Bulychev пишет:
Что такое дочерний стейт я не понимаю.
имеется ввиду контекст созданный lua_newthread. просто по Вашим словам можно именно так понять, что закрывая скрипт - мы на самом деле не уничтожаем его VM.
lua_newthread тут не причем. речь шла о совершенно другом. VM Lua закрывается.
 
Цитата
Michael Bulychev пишет:
VM Lua закрывается
значит ли это, то она стала закрываться совсем недавно? бо как не так давно - это было совсем нет так, увы...
 
она закрывалась и раньше, просто в другой момент времени.
 
я про это: http://forum.quik.ru/messages/forum10/message1359/topic176/#message1359
 
и я про это. раньше все случалось при рестарте скрипта.
 
Цитата
Michael Bulychev пишет:
она закрывалась и раньше, просто в другой момент времени.
это уже звучит, как оправдания. ладно, больше нет вопросов.
 
Цитата
Michael Bulychev пишет:
Чтоб бы избежать такого придется закрывать все окна созданные скриптом после его остановки.
Михаил.

Любой пользователь и любой программист привыкли, что при прерывании выполнения программы windows сама уничтожает (по возможности) все окна и прочие хвосты, созданные этой программой. Соответственно, логично перенести этот механизм и на машину qlua.

Я не могу представить, с какой целью может понадобиться окно на экране, оставшееся после завершения скрипта. Нет хозяина - не должно быть и окон, локированных файлов и всего остального.
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Цитата
s_mike@rambler.ru пишет:
Я не могу представить, с какой целью может понадобиться окно на экране, оставшееся после завершения скрипта.
А это зависит от цели создания окна.
Скрипт, например, может выполнять разовую (т.е., без цикла в main) работу длительного характера с выводом результатов работы на экран.
Надо делать так, как надо. А как не надо - делать не надо.
 
Цитата
Серж пишет:
Цитата
s_mike@rambler.ru пишет:
Я не могу представить, с какой целью может понадобиться окно на экране, оставшееся после завершения скрипта.
А это зависит от цели создания окна.
Скрипт, например, может выполнять разовую (т.е., без цикла в main) работу длительного характера с выводом результатов работы на экран.
В этом случае нет проблем по окончании этой разовой работы вставить  sleep(1e10), если окно нужно держать открытым.
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Цитата
Серж пишет:
Скрипт, например, может выполнять разовую (т.е., без цикла в main)
как вы себе это представляете? При условии нормальной работы qlua и отсутствии майна - скрипт полностью завершает свою работу.
соответственно, и прошлый мой пример по идее не должен был работать: http://forum.quik.ru/messages/forum10/message1350/topic176/#message1350
 
Цитата
sam063rus пишет:
Цитата
Серж пишет:
Скрипт, например, может выполнять разовую (т.е., без цикла в main)
как вы себе это представляете? При условии нормальной работы qlua и отсутствии майна - скрипт полностью завершает свою работу.
соответственно, и прошлый мой пример по идее не должен был работать: http://forum.quik.ru/messages/forum10/message1350/topic176/#message1350
Такая возможность действительно закладывалась. Отработал скрипт один раз и оставил таблицу, дальше она живет отдельно от скрипта.к коду она не привязана.
 
Извините, что несовсем в тему:

я думаю, лучше было бы, если разработчики определили бы так называемый класс QScript, имеющий одним из родителей класс CWnd, либо, обладающий возможностью создавать окна, который мы потом назовём главным и который будет владельцем всех окон порождённых от него. это значительно упростит написание/управление контролами.

Michael Bulychev, прошу зарегистрировать пожелание.
 
Цитата
sam063rus пишет:
Извините, что несовсем в тему:

я думаю, лучше было бы, если разработчики определили бы так называемый класс QScript, имеющий одним из родителей класс CWnd, либо, обладающий возможностью создавать окна, который мы потом назовём главным и который будет владельцем всех окон порождённых от него. это значительно упростит написание/управление контролами.

Michael Bulychev , прошу зарегистрировать пожелание.
Считайте что функции для работы с таблицами являются методами такого класса, а table_id  идентификатор объекта. Что это меняет?
Кстати, Вы так и не дописали интерфейсы объектов в одной из веток форума.
 
между нами говоря - мы оба прекрасно знаем чем является t_id и что никакой это не HWND, что сильно усложняет задачу. t_id - это всего лишь некий индекс в QLUA и не более. поэтому нет возможности сказать windows, что это "папа" контрола. грешным делом была задумка одно время сделать невидимую таблицу нулевого размера, чтоб состряпать из неё базовый класс для контролов но и эту затею можно спустить в унитаз.

Насчёт интерфейсов классов - я просто начинаю отчаиваться в затее прямого диалога с разработчиками. Михаил, если вы по-прежнему в этом заинтересованы - то я буду продолжать.
 
Цитата
s_mike@rambler.ru пишет:
В этом случае нет проблем по окончании этой разовой работы вставитьsleep(1e10), если окно нужно держать открытым.
Что-то мне подсказывает, что при попытке остановить такой скрипт терминал зависнет.
В любом случае проще предусмотреть закрытие окна в коде, если оно более не требуется, по окончании скрипта.
Цитата
Michael Bulychev пишет:
Такая возможность действительно закладывалась. Отработал скрипт один раз и оставил таблицу, дальше она живет отдельно от скрипта.к коду она не привязана.
Считаю вполне нормальным такое поведение.
Надо делать так, как надо. А как не надо - делать не надо.
 
Цитата
sam063rus пишет:
между нами говоря - мы оба прекрасно знаем чем является t_id и что никакой это не HWND, что сильно усложняет задачу. t_id - это всего лишь некий индекс в QLUA и не более. поэтому нет возможности сказать windows, что это "папа" контрола. грешным делом была задумка одно время сделать невидимую таблицу нулевого размера, чтоб состряпать из неё базовый класс для контролов но и эту затею можно спустить в унитаз.

Насчёт интерфейсов классов - я просто начинаю отчаиваться в затее прямого диалога с разработчиками. Михаил, если вы по-прежнему в этом заинтересованы - то я буду продолжать.
1. Никто Вам напрямую HWND без оберток не отдаст, это совершенно лишнее. К тому же никто его легко найти самому.
2. Продолжайте, просто пока я не вижу что там обсуждать.
 
Цитата
Michael Bulychev пишет:
К тому же никто его легко найти самому.
по-видимому, надо понимать, что: найти - легко? найти-то легко но, там у вас ещё идёт возможность переключения отображения между вкладками.
насчёт лишнее - оно было бы лишним, если бы вы сделали для нас свой аналог VCL. Но мне катастрофически непонятно почему Вы до си пор этого не делаете? Ведь всё для этого у вас в коде уже есть - надо просто дать пользователям пользоваться наконец.
Или, оставьте квик и клуа для себя и молитесь на него/неё. и никто у вас её не украдёт и пользоваться не будет. прям, как детский сад. или делайте до конца или не выходите вовсе с сырым продуктом на рынок.
 
Цитата
Michael Bulychev написал:
. К тому же никто его легко найти самому.
Значит ли это, что Вы, тем самым хотите сказать, что:
  1. К тому же никто НЕ запрещает его легко найти самому.
  2. Arqa Technologies готова ОФИЦИАЛЬНО заявить, что она НЕпротив того, что пользователи САМИ средствами WINAPI - определяли хендл HWND таблицы QTable (QLUA)
Michael Bulychev
требуется обязательный ответ.
 
Добрый день.
Не вижу связи между эти двумя пунктами.
 
Цитата
Michael Bulychev написал:
Добрый день.
Не вижу связи между эти двумя пунктами.
не ответ.
тогда уж, по первому пункту выскажитесь.
 
А что там можно добавить? технология всем известна.
 
Цитата
Michael Bulychev написал:
А что там можно добавить? технология всем известна.
скажите ПРЯМО - если пользователь создаст таким образом свой визуальный класс (контрол), узная с помощью средств WINAPI HWND таблицы QTable QUIK-а и станет его (созданный визуальный класс) - распространять в сети интернет (т.е. нетолько для личного пользования) - его ждут последствия от лица Компании?

т.е. основная идея - прежняя - брать квиковскую таблицу - сделать её Родителем и уже на основе её оконного хендла - порождать свои контролы.
 
Можно, но не до конца понятен смысл. (Мне)
Ну разве что красиво: типа "я в квике интерфейс рисую"
 
Цитата
swerg написал:
Можно, но не до конца понятен смысл. (Мне)
Ну разве что красиво: типа "я в квике интерфейс рисую"
Вы - не сотрудник Компании. Поэтому Ваши можно - не канают.

А насчёт "красоты" - именно в этом - всё и дело. Нужен ЗАКОННЫЙ метод отображать свои окна на вкладках квика и более того, иметь возможность ещё и прикреплять свои окна к вкладкам.
Этого - можно добиться средствами WINAPI - но, интересует правовая основа. Потому как - хотелось бы, чтоб визуальная библиотека - была общедоступна.
Страницы: 1
Читают тему
Наверх