Laine_prikol 48 Опубликовано: 16 сентября, 2017 (изменено) не могу запретить выход из программы по Ctrl+Alt+C. event.shouldInterrupt() не работает. Пробовал в цикле и без. вообще не работает! local event = require "event" function event.shouldInterrupt() return false end Minecraft 1.11.2 OpenComputers 1.7.0.40. OpenOS 1.6.7 Изменено 20 сентября, 2017 пользователем Laine_prikol Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
MeXaN1cK 53 Опубликовано: 16 сентября, 2017 Лайн, смотри, у меня есть старый код для дверей с кодовым замком, так вот там есть 2 функции: idea и idea2. Они как раз отвечают за подобную проблему. Собственно ссылка на код: https://pastebin.com/A4Lf5c4G Надеюсь это тебе поможет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fingercomp 4 409 Опубликовано: 16 сентября, 2017 (изменено) Без переписывания либы ивентов это теперь невозможно. UPD. Однако pcall всё ещё может обрабатывать интеррапты любой севёрности. Только ошибок обычных не увидишь. Изменено 16 сентября, 2017 пользователем Fingercomp Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ECS 1 903 Опубликовано: 16 сентября, 2017 Простым решением проблемы будет использование computer.pullSignal() вместо event.pull(), убрав тем самым поддержку прерывания скрипта. В качестве альтернативы предлагаю эквивалентную по структуре либу, где для отключения прерывания необходимо поставить флаг event.interruptingEnabled = false Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fingercomp 4 409 Опубликовано: 16 сентября, 2017 Простым решением проблемы будет использование computer.pullSignal() вместо event.pull(), убрав тем самым поддержку прерывания скрипта. Отложив то, что это банально неудобно (нет фильтров, например), в версиях новых OpenOS интеррапт обрабатывается в том числе и в computer.pullSignal (он переопределяется в /lib/event.lua). На ум приходит только pcall. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Laine_prikol Автор вопроса 48 Опубликовано: 16 сентября, 2017 (изменено) Без переписывания либы ивентов это теперь невозможно. UPD. Однако pcall всё ещё может обрабатывать интеррапты любой севёрности. Только ошибок обычных не увидишь. Я с pcall пытался там появлялся курсор, и я не мог ничего нажать мышкой, да и желательно нужна функция которая работала бы вне цикла. Я придумал мини-костыль. Пишу я общий магазин, и можно сделать если игрок нажимает Ctrl+alt+С перезагружался комп Изменено 16 сентября, 2017 пользователем Laine_prikol Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fingercomp 4 409 Опубликовано: 17 сентября, 2017 local function pullEvent(...) local result repeat result = table.pack(pcall(event.pull, ...)) until result[1] return table.unpack(result, 2) end Как-то так. Или можно подождать, пока payonel не запилит обработку сигналов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ECS 1 903 Опубликовано: 17 сентября, 2017 в версиях новых OpenOS интеррапт обрабатывается в том числе и в computer.pullSignal (он переопределяется в /lib/event.lua) Фига, не ждал от них подобной ерунды, еще один повод в копилку "отказаться от опеносовской либы". Если по теме, то проверил следующий код на последней версии опенкомпов, интерруптинг отключается без проблем: event.shouldInterrupt = function() return false end event.shouldSoftInterrupt = event.shouldInterrupt 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fingercomp 4 409 Опубликовано: 17 сентября, 2017 Фига, не ждал от них подобной ерунды, еще один повод в копилку "отказаться от опеносовской либы". Если по теме, то проверил следующий код на последней версии опенкомпов, интерруптинг отключается без проблем: [...] В версии OpenComputers 1.6.2 OpenOS протух капитально. Нужно использовать дев-билды. И это изменение — не ерунда ни коим разом. Очень даже удобно, что если где-то доигрался с computer.pullSignal, можно всё равно остановить программу. 23:06:20 <+payonel> fingercomp: i'm here for a short moment, my internet connection on vacation is painfully unreliable 23:09:53 <fingercomp> payonel: I want to ignore hard interrupts in my program. Is there a way to do so without converting the body into a function and `pcall`ing it? 23:15:16 <+payonel> fingercomp: i have a short term hack for you, and long term i think the right thing to do is to give you an event registration you can use to handle hard interrupts to your program 23:15:18 <+payonel> the main reason i removed the event.shouldInterrupt and friends was because i never liked the user solution to be "change this openos internal method" 23:15:19 <+payonel> if that makes sense 23:20:14 <+payonel> fingercomp: anyways, if you want a hack, you can just do something like: https://hastebin.com/uletiduqid.lua 23:20:54 <+payonel> or maybe... 23:22:45 <fingercomp> I'd rather wait for a proper way to do this (right now I'm just `pcall`ing `event.pull` since it doesn't throw errors other than "interrupted") 23:24:02 <+payonel> loadfile("your_program.lua", setmetatable({error=function(...) if (...) == "interrupted" then return end error(...) end}, {__index=_G})) 23:25:16 <+payonel> a proper way? ok, i'll give that some more serious thought this week 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
eu_tomat 2 154 Опубликовано: 17 сентября, 2017 Тема интересная, и чтобы код по ссылке из переписки @Fingercomp не протух, продублирую его здесь: https://hastebin.com/uletiduqid.lua local real_error = error pcall(function() error = function(...) if (...) == "interrupted" then return end real_error(...) end -- real program body end) error = real_error Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ECS 1 903 Опубликовано: 17 сентября, 2017 Очень даже удобно, что если где-то доигрался с computer.pullSignal, можно всё равно остановить программу И очень даже неудобно, если требуется запретить прерывание софтины в частности. Если я желаю остановить выполнение зависшего скрипта, использовать фильтры и листенеры, то, очевидно, воспользуюсь библиотекой event, в противном случае я стану использовать нативный метод pullSignal. Увы, эту возможность у кодеров под OpenOS нагло отняли и навязали подмену функции без разумного объяснения причин. Высказывание автора о том, что он "never liked the user solution to be change this openos internal method" я разумным счесть не могу, ибо на производительность OpenOS это никак не повлияет, а немаловажная фича была слита в унитаз. Это не разумная причина, а субъективная придурь, и именно поэтому я и использовал термин "ерунда", и именно поэтому решение ерундовое Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fingercomp 4 409 Опубликовано: 17 сентября, 2017 Слишком критиковать не стоит. Опенось новая доступна тоьлко в дев-билдах, как уже сказано, а не в стабильном релизе каком-нибудь. Посмотрим, что придумает он с этим. P. S. Хотя согласен, что как-то тупо сначала удалять фичу, а потом думать, как её вернуть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Totoro 3 563 Опубликовано: 17 сентября, 2017 Согласен с предыдущими ораторами. Если компьютер намертво повис - его можно выключить и снова включить. Но фишки с блокировкой прерываний очень полезны в целом ряде софта - банки, инфо-щиты, всякие терминалы и т.п. Поэтому это нововведение не совсем понятно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Laine_prikol Автор вопроса 48 Опубликовано: 20 сентября, 2017 (изменено) Слишком критиковать не стоит. Опенось новая доступна тоьлко в дев-билдах, как уже сказано, а не в стабильном релизе каком-нибудь. Посмотрим, что придумает он с этим. P. S. Хотя согласен, что как-то тупо сначала удалять фичу, а потом думать, как её вернуть. Может из-за этого и не работает? У меня альфа версия ОС 1.7.0.40-alpha Изменено 20 сентября, 2017 пользователем Laine_prikol Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
не могу запретить выход из программы по Ctrl+Alt+C. event.shouldInterrupt() не работает. Пробовал в цикле и без. вообще не работает!
Minecraft 1.11.2
OpenComputers 1.7.0.40. OpenOS 1.6.7
Изменено пользователем Laine_prikolПоделиться сообщением
Ссылка на сообщение
Поделиться на других сайтах