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

Как отключить Ctrl+Alt+C?

Вопрос

Ещё раз здравствуйте. Недавно при написании казино и банка столкнулся с такой проблемой, что любой клиент сможет закрыть программу. Я пару раз видел подобные программы, в которых не работало сочетание клавиш Ctrl+Alt+C. Предполагаю, что нужно удалить какой-то файл из openos. Жду вашей помощи :)

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


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

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

Короче. Есть способ полегче. Просто скачайте библиотеку event.lua от ECS и там в начале библы есть переменная вроде InterruptedEnable. в своей проге вроде нужно присвоить ей 0. Лучше у ECS спросите)

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


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

Короче, если вопрос еще актуален, код чуть ниже предоставляет 2 функции включить и выключить, никаких модификаций в библиотеках он не требует, т.е. достаточно вставить его куда-нибудь поближе к началу. Работает за счёт переопределения computer.pullSignal блокируя все ошибки изнутри.

local computer = require("computer")
local pullSignalBackup = nil

local function DisableInterrupt()
  if pullSignalBackup ~= nil then
    return false
  end
  pullSignalBackup = computer.pullSignal
  computer.pullSignal = function(...)
    local tbl = {pcall(pullSignalBackup, ...)}
    return table.unpack(tbl, 2)
  end
  return true
end

local function EnableInterrupt()
  if pullSignalBackup == nil then
    return false
  end
  computer.pullSignal = pullSignalBackup
  pullSignalBackup = nil
  return true
end
Изменено пользователем astral17

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


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

Поиск по форуму приводит к следующему решению:

http://computercraft.ru/topic/1870-kak-predotvratit-prinuditelnyi-ostanov-prog/

 

 

скорее всего как-то так (вставить функцию куда-то в тело программки):

function event.shouldInterrupt()
    return false
end

 

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


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

Правильный ответ: никак. payonel отрубил это давным-давно из-за костылизма решения. Обратно что-то заменяющее, однако, введено не было.

 

Можно пока эксперементировать с pcall, ибо hard interrupt (^[c) — это обычная ошибка, пущенная через error.

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


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

Что-то я не понял.

Если я вставлю ЭТО

function event.shouldInterrupt()

 return false

end

в свою прогу, то это мне поможет или нет???

Если да, то как правильно эту функцию вызвать и т.д.

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


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

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

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


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

 

 

Что-то я не понял. Если я вставлю ЭТО

это не поможет. Вообще. Никак. Сказано же вырезали такую опцию. Так что крутись как-нибудь по другому, вон @@Fingercomp предлагает вариант свой, его пробуй. Или вообще не давай доступа шаловливым ручками пользователей к клавиатуре. Можно еще бесконечный цикл запустить без sleep тогда вообще фиг отрубишь. Или на версию постарее ОС откатиться. 

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


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

Кстати да, установи старую версию ОС какую-нибудь и радуйся тому что данная опция работает.

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


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

Бесконечный цикл без слипа не подходит. А вариант фингеркомпа я не понял. Можете объяснить что за эксперименты с pcall?

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


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

Правильный ответ: никак. payonel отрубил это давным-давно из-за костылизма решения. Обратно что-то заменяющее, однако, введено не было.

О, печаль.

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

Подход рабочий, но прелесть системы в возможности использовать уже готовые библиотеки. Решение не для всех.

Предполагаю, что нужно удалить какой-то файл из openos

Не скачивал свежую версию OpenComputers, но если имеющиеся у меня файлы не устарели, то должно помочь удаление из файла /lib/event.lua следующих строк:

  local interrupting = current_time - lastInterrupt > 1 and keyboard.isControlDown() and keyboard.isKeyDown(keyboard.keys.c)
  if interrupting then
    lastInterrupt = current_time
    if keyboard.isAltDown() then
      error("interrupted", 0)
    end
    event.push("interrupted", current_time)
  end
А можно вырезать только эту часть:

    if keyboard.isAltDown() then
      error("interrupted", 0)
    end
Зависит от того, какая часть имеющейся логики останова программы должна быть урезана. Изменено пользователем eu_tomat
дополнение

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


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

Короче, если вопрос еще актуален, код чуть ниже предоставляет 2 функции включить и выключить, никаких модификаций в библиотеках он не требует, т.е. достаточно вставить его куда-нибудь поближе к началу. Работает за счёт переопределения computer.pullSignal блокируя все ошибки изнутри.

Вопрос ещё как актуален, он регулярно всплывает. И ознакомиться с таким решением очень полезно. Наилучший ответ.

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


Ссылка на сообщение
Поделиться на других сайтах
В 05.08.2018 в 20:26, kaka888 сказал:

Бесконечный цикл без слипа не подходит. А вариант фингеркомпа я не понял. Можете объяснить что за эксперименты с pcall?

О да, я этот способ давно пробовал со своей прогой на турель.

Раньше я всегда использовал способ описанный ранее с event.shouldInterrupt(), но в проге на турель была другая проблема. Сканер мобов мог выдать ошибку при сканировании и прога вылетала.

На случай таких вылетов мне посоветовали часть проги которая вылетает засунуть в функцию. Я же засунул ВЕСЬ код в функцию start() например. И в цикле вызывал эту функцию через функцию pcall()

Вся суть в том, что когда произойдёт ошибка, функция pcall должна просто выдать false, а программа при этом продолжит свой ход и по циклу запустится снова. Некий аварийный перезапуск на случай сбоя получается.

И программа таким образом не сможет завершится.

 

Но то? что это будет работать, не гарантирую. Та же прога на турель как посмотрю уже устарела и не работает на новую версию модов.

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


Ссылка на сообщение
Поделиться на других сайтах
В 17.09.2018 в 23:57, kaka888 сказал:

Короче. Есть способ полегче. Просто скачайте библиотеку event.lua от ECS и там в начале библы есть переменная вроде InterruptedEnable. в своей проге вроде нужно присвоить ей 0. Лучше у ECS спросите)

Хорошая шутка. Сам спросил, сам ответил, назвал ответ лучшим, а в ответе посоветовал спросить у ECS.

* Предлагается скачать библиотеку, но ссылка на неё не указана.

* Предлагается что-то чему-то присвоить. Вроде бы.

* Предлагается спросить у ECS.

И правда, лучший ответ!

 

@ECS, сможешь распутать этот клубок вопросов?

По какой ссылке качать, куда совать библиотеку, что чему присваивать, и работает ли оно в современных версиях OpenOS?

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


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

По какой ссылке качать, куда совать библиотеку, что чему присваивать, и работает ли оно в современных версиях OpenOS?

Вроде это, работать должна по идее, почему нет? 

Закидывать в /lib, в начале программы "interruptingEnabled = true" предполагаю что нужно поставить на "false"

И да, по идее нужно назвать её не event, а то заменит стандартную event-либу от OC

https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/lib/event.lua

ИМХО, решение от Astral'а лучше, ибо требует просто копипаста в прогу, а тут нужно что-то скачивать, так что ничего не проще)

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

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


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

 

 

@ECS, сможешь распутать этот клубок вопросов?

 

Чего сразу ECS-то? Это все он, это он, не впутывайте! Либа - полный аналог опеносовской. Разница в том, что она работает шустрее, не подменяет pullSignal на кастомный, не требует внешних либ по типу keyboard, а также позволяет отключать и кастомизировать коды клавиш прерывания. Работать оно работает на всех версиях OC, скачивание вместо дефолтной комп не взорвет. Усе.

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


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

Ну, да, тащить целую либу для этого — это уже нюкой по мухам. В OpenOS 1.7.3 вернут назад способ отключить хард-интеррапты, причём для конкретного процесса, а не всей системы.

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


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

Хорошая шутка. Сам спросил, сам ответил, назвал ответ лучшим, а в ответе посоветовал спросить у ECS.

...

кака самолюб похоже, он во всех темах свои сообщения делает лучшими ответами не дожидаясь реально хорошего ответа.

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

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


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

 

 

В OpenOS 1.7.3 вернут назад способ отключить хард-интеррапты, причём для конкретного процесса, а не всей системы.

 

Когда она там релизнется, кстати?

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


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

Когда она там релизнется, кстати?

Наиболее точная оценка даты релиза экспертами — "тогда, когда релизнется". Точнее нигде не видел.

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


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

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

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

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

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

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

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

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

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


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