Перейти к публикации
Форум - ComputerCraft
  • 0
kaka888

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

Вопрос

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

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


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

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

  • 0

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

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


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

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

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

 

 

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

function event.shouldInterrupt()
    return false
end

 

  • Like 1

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


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

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

 

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

  • Like 3

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


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

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

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

function event.shouldInterrupt()

 return false

end

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

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

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


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

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

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


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

 

 

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

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

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


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

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

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


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

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

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


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

Правильный ответ: никак. 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
дополнение
  • Like 3

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


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

Короче, если вопрос еще актуален, код чуть ниже предоставляет 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
  • Like 3

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


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

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

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

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


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

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

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

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

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

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

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

 

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

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


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

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

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

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

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

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

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

 

 

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

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

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


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

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

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

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

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

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

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

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

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


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

 

 

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

 

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

  • Like 2

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


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

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

  • Like 2

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


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

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

...

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

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

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


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

 

 

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

 

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

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


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

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

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

  • Like 2

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


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

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×