Перейти к содержимому
  • 0
Laine_prikol

Не работает event.shouldInterrupt()

Вопрос

не могу запретить выход из программы по 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

Изменено пользователем Laine_prikol

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рекомендуемые сообщения

Лайн, смотри, у меня есть старый код для дверей с кодовым замком, так вот там есть 2 функции: idea и idea2. Они как раз отвечают за подобную проблему. Собственно ссылка на код: https://pastebin.com/A4Lf5c4G Надеюсь это тебе поможет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Без переписывания либы ивентов это теперь невозможно.

 

UPD. Однако pcall всё ещё может обрабатывать интеррапты любой севёрности. Только ошибок обычных не увидишь.

Изменено пользователем Fingercomp

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Простым решением проблемы будет использование computer.pullSignal() вместо event.pull(), убрав тем самым поддержку прерывания скрипта. В качестве альтернативы предлагаю эквивалентную по структуре либу, где для отключения прерывания необходимо поставить флаг event.interruptingEnabled = false

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Простым решением проблемы будет использование computer.pullSignal() вместо event.pull(), убрав тем самым поддержку прерывания скрипта.

Отложив то, что это банально неудобно (нет фильтров, например), в версиях новых OpenOS интеррапт обрабатывается в том числе и в computer.pullSignal (он переопределяется в /lib/event.lua). На ум приходит только pcall.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Без переписывания либы ивентов это теперь невозможно.

 

UPD. Однако pcall всё ещё может обрабатывать интеррапты любой севёрности. Только ошибок обычных не увидишь.

Я с pcall пытался там появлялся курсор, и я не мог ничего нажать мышкой, да и желательно нужна функция которая работала бы вне цикла. Я придумал мини-костыль. Пишу я общий магазин, и можно сделать если игрок нажимает Ctrl+alt+С перезагружался комп

Изменено пользователем Laine_prikol

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

local function pullEvent(...)
  local result
  repeat
    result = table.pack(pcall(event.pull, ...))
  until result[1]
  return table.unpack(result, 2)
end

Как-то так. Или можно подождать, пока payonel не запилит обработку сигналов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

в версиях новых OpenOS интеррапт обрабатывается в том числе и в computer.pullSignal (он переопределяется в /lib/event.lua)
 

Фига, не ждал от них подобной ерунды, еще один повод  в копилку "отказаться от опеносовской либы". Если по теме, то проверил следующий код на последней версии опенкомпов, интерруптинг отключается без проблем:

event.shouldInterrupt = function() return false end
event.shouldSoftInterrupt = event.shouldInterrupt

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Фига, не ждал от них подобной ерунды, еще один повод  в копилку "отказаться от опеносовской либы". Если по теме, то проверил следующий код на последней версии опенкомпов, интерруптинг отключается без проблем:

[...]

В версии 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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Тема интересная, и чтобы код по ссылке из переписки @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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Очень даже удобно, что если где-то доигрался с computer.pullSignal, можно всё равно остановить программу

И очень даже неудобно, если требуется запретить прерывание софтины в частности. Если я желаю остановить выполнение зависшего скрипта, использовать фильтры и листенеры, то, очевидно, воспользуюсь библиотекой event, в противном случае я стану использовать нативный метод pullSignal. Увы, эту возможность у кодеров под OpenOS нагло отняли и навязали подмену функции без разумного объяснения причин. Высказывание автора о том, что он "never liked the user solution to be change this openos internal method" я разумным счесть не могу, ибо на производительность OpenOS это никак не повлияет, а немаловажная фича была слита в унитаз. Это не разумная причина, а субъективная придурь, и именно поэтому я и использовал термин "ерунда", и именно поэтому решение ерундовое

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Слишком критиковать не стоит. Опенось новая доступна тоьлко в дев-билдах, как уже сказано, а не в стабильном релизе каком-нибудь. Посмотрим, что придумает он с этим.

 

P. S. Хотя согласен, что как-то тупо сначала удалять фичу, а потом думать, как её вернуть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Согласен с предыдущими ораторами.

Если компьютер намертво повис - его можно выключить и снова включить.

Но фишки с блокировкой прерываний очень полезны в целом ряде софта - банки, инфо-щиты, всякие терминалы и т.п.

Поэтому это нововведение не совсем понятно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Слишком критиковать не стоит. Опенось новая доступна тоьлко в дев-билдах, как уже сказано, а не в стабильном релизе каком-нибудь. Посмотрим, что придумает он с этим.

 

P. S. Хотя согласен, что как-то тупо сначала удалять фичу, а потом думать, как её вернуть.

Может из-за этого и не работает? У меня альфа версия ОС 1.7.0.40-alpha

Изменено пользователем Laine_prikol

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...