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


Фотография

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


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 11

#1 Оффлайн   kaka888

kaka888
  • Пользователи
  • Сообщений: 14
  • Уровень сигнала: 1,73%
  • В игре: 14 час. 50 мин.
  • ГородМинск

Отправлено 05 Август 2018 - 19:34

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



#2 Онлайн   eu_tomat

eu_tomat
  • Хранители Кода
  • Сообщений: 935
  • Уровень сигнала: 5,93%
  • В игре: 50 час. 55 мин.

Награды

                          

Отправлено 05 Август 2018 - 19:43

Поиск по форуму приводит к следующему решению:
http://computercraft...i-ostanov-prog/


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

function event.shouldInterrupt()
    return false
end


  • qwertyMAN это нравится

#3 Оффлайн   Fingercomp

Fingercomp
  • Гуру
  • Сообщений: 2 015
  • Уровень сигнала: 149,05%
  • В игре: 1279 час. 35 мин.

Награды

                                               

Отправлено 05 Август 2018 - 20:01

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

 

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


  • Asior, qwertyMAN и Kartze это нравится

#4 Оффлайн   kaka888

kaka888
  • Автор темы
  • Пользователи
  • Сообщений: 14
  • Уровень сигнала: 1,73%
  • В игре: 14 час. 50 мин.
  • ГородМинск

Отправлено 05 Август 2018 - 20:11

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

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

function event.shouldInterrupt()

 return false

end

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

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



#5 Оффлайн   Xytabich

Xytabich
  • Пользователи
  • Сообщений: 73
  • Уровень сигнала: 24,96%
  • В игре: 214 час. 14 мин.
  • ГородКазань

Награды

           

Отправлено 05 Август 2018 - 20:12

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



#6 Оффлайн   Asior

Asior
  • Пользователи
  • Сообщений: 184
  • Уровень сигнала: 60,66%
  • В игре: 520 час. 47 мин.

Награды

                          

Отправлено 05 Август 2018 - 20:20

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

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



#7 Оффлайн   Asior

Asior
  • Пользователи
  • Сообщений: 184
  • Уровень сигнала: 60,66%
  • В игре: 520 час. 47 мин.

Награды

                          

Отправлено 05 Август 2018 - 20:22

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



#8 Оффлайн   kaka888

kaka888
  • Автор темы
  • Пользователи
  • Сообщений: 14
  • Уровень сигнала: 1,73%
  • В игре: 14 час. 50 мин.
  • ГородМинск

Отправлено 05 Август 2018 - 20:26

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



#9 Онлайн   eu_tomat

eu_tomat
  • Хранители Кода
  • Сообщений: 935
  • Уровень сигнала: 5,93%
  • В игре: 50 час. 55 мин.

Награды

                          

Отправлено 05 Август 2018 - 20:28

Правильный ответ: никак. 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: 05 Август 2018 - 20:34
дополнение

  • Alex, Asior и Kartze это нравится

#10 Оффлайн   astral17

astral17
  • Пользователи
  • Сообщений: 59
  • Уровень сигнала: 7,76%
  • В игре: 66 час. 37 мин.

Награды

              

Отправлено 06 Август 2018 - 13:43

Короче, если вопрос еще актуален, код чуть ниже предоставляет 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: 06 Август 2018 - 16:32

  • Asior, eu_tomat и Kartze это нравится

#11 Онлайн   eu_tomat

eu_tomat
  • Хранители Кода
  • Сообщений: 935
  • Уровень сигнала: 5,93%
  • В игре: 50 час. 55 мин.

Награды

                          

Отправлено 07 Август 2018 - 00:16

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

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

#12 Оффлайн   qwertyMAN

qwertyMAN
  • Пользователи
  • Сообщений: 1 458
  • Уровень сигнала: 0,22%
  • В игре: 1 час. 54 мин.
  • ГородCity17

Награды

                             

Отправлено 11 Август 2018 - 22:23

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

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

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

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

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

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

 

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






Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных