OnStop

Страницы: 1
RSS
OnStop
 
Это верно, что во время работы колбэка OnStop работа потока main приостанавливается?
Кроме того, скрипту даётся время на завершение работы, которое отсчитывается не по окончании OnStop (как это показано на вашей схеме), а от начала работы функции OnStop. Т.о., схема должна выглядеть так:
Скрытый текст
Надо делать так, как надо. А как не надо - делать не надо.
 
https://quik2dde.ru/viewtopic.php?id=16

здесь истинно верная схема.
а квиковцы сами не знают, что творят.

(проверить на последних версиях? Вдруг что поменяли)
 
Добрый день.
На схеме все верно указано.
Пример иллюстрирующий данное поведение:
Код
function OnStop()
  message(string.format("OnStop %s (%s)", osTime(), tostring(os.clock())))
  return 5000
end

function osTime()
  local _date = os.date("*t")
  return string.format("%02d:%02d:%02d",_date.hour, _date.min, _date.sec)
end

function main() 
  while true do
    message(string.format("main... %s (%s)", osTime(), tostring(os.clock())))
    sleep(1000)
  end
end
запустив скрипт, Вы увидите, что после вызова OnStop() поток main продолжает работать:

main... 11:46:03 (92122.959)
main... 11:46:04 (92123.959)
OnStop 11:46:05 (92124.872)
main... 11:46:05 (92124.96)
main... 11:46:06 (92125.96)
main... 11:46:07 (92126.96)
main... 11:46:08 (92127.961)
main... 11:46:09 (92128.961)
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
 
Проверил на версии 7.7
все осталось также, как по ссылке выше с описанием работы QLua
 
Nikolay Pavlov,
Да, я ошибся в том, что отсчёт 5-секундного завершения скрипта всё же начинается по окончании OnStop.

Цитата
Nikolay Pavlov написал:
Вы увидите, что после вызова OnStop() поток main продолжает работать
Ваша неправда: добавив в OnStop некоторые финализирующие действия, вы увидите, что пока они не будут выполнены, поток main не будет выполнять свою работу.
А возобновит её после окончания работы OnStop.

Код
local run = true

local function Print(text)
  PrintDbgStr(os.clock() .. ' ' .. text)
end

function main()
  while run do
    sleep(100)
    Print('main')
  end
  sleep(4000)
  Print('Quit')
end
function OnStop(s)
  Print('OnStop')
  run = nil
  _sleep(3000)   -- Здесь вы можете добавить некоторую работу, выполняющуюся на вашем компьютере определённое количество времени
  Print('OnStop')
  return 5000
end

Результат:
Цитата
31169.066 main
31169.167 main
31169.267 main
31169.368 main
31169.468 main
31169.569 main
31169.604 OnStop
31172.605 OnStop
31172.605 main
31176.607 Quit
Надо делать так, как надо. А как не надо - делать не надо.
 
Проверил: в v.6.16 потоки OnStop и main работали параллельно. В v.6.17 здесь уже внесли изменения.
Возможно, сделано это было в благих целях: для корректной выгрузки библиотек или как-то так. Но об этом предупреждать же надо!
Надо делать так, как надо. А как не надо - делать не надо.
 
Цитата
Старатель написал:

Ваша неправда: добавив в OnStop некоторые финализирующие действия, вы увидите, что пока они не будут выполнены, поток main не будет выполнять свою работу.
А возобновит её после окончания работы OnStop.
ваша неправда в том, что в OnStop вы первым делом прерываете цикл в main.
     run = nil
а после ошибочно утверждаете, что майн параллельно не работает.

вот здесь пример скрипта и подробные исследования откуда взялась ранее указанная мной схема

https://quik2dde.ru/viewtopic.php?id=23

которую арка не стесняясь стырила в свою документацию, да еще переврала.
 
Цитата
swerg написал:
ваша неправда в том, что в OnStop вы первым делом прерываете цикл в main.
     run = nil
а после ошибочно утверждаете, что майн параллельно не работает.
Ваша неправда в том, что вы даже не проверили на то, о чём говорите.
Можете переписать OnStop так:
Код
function OnStop(s)
  Print('OnStop')
  _sleep(3000)   -- Здесь вы можете добавить некоторую работу, выполняющуюся на вашем компьютере определённое количество времени
  Print('OnStop')
  run = nil
  return 5000
end
и убедиться, что в QUIK v.7 OnStop и main параллельно не работают.
Надо делать так, как надо. А как не надо - делать не надо.
 
Однако вы правы про то, что выполнение main() прерывается на время OnStop(), как-то я вчера был невнимателен.
Причем в самом деле: поведение изменилось между версиями 6.16.1 и 6.17.0

Хотелось бы услышать пояснения от разработчиков, такого изменения поведения не было заявлено, выходит это баг.
 
Здравствуйте,
Проблема изучается. Постараемся в ближайшее время дать ответ.
 
Здравствуйте,
Описанное поведение будет исправлено в одной из следующих версий программы .
 
swerg написал:
Цитата
Однако вы правы про то, что выполнение main() прерывается на время OnStop(), как-то я вчера был невнимателен.
Причем в самом деле: поведение изменилось между версиями 6.16.1 и 6.17.0

Хотелось бы услышать пояснения от разработчиков, такого изменения поведения не было заявлено, выходит это баг.
Добрый день,
   
    Описанная в данном инциденте проблема была устранена в версии 7.10.0     терминала QUIK.
    Рекомендуем Вам обновить версию программы.
   
    Приносим извинения за причиненные неудобства.
Страницы: 1
Читают тему
Наверх