Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 28, 2024 11:03:54

Wor7hless
Зарегистрирован: 2024-08-28
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Как предотвратить ввод данных в пайтон во время выполнения функции

Всем доброго времени суток! Есть такая проблема. Я разрабатываю пропускную систему для колледжа - турникет открывается с помощью QR-кода. Все настроено с базой данных, сама система работает стабильно. Но есть один нюанс:
там стоят два сканнера, один на вход и один на выход и если два человека просканируют свой код одновременно, система выйдет из строя. Сначала она сработает у одного человека, а затем у второго. Но если продолжить сканирование, это приведет к непредсказуемому переключению турникетов. Если вы представите, что вместо двух человек их будет 5 или 7, то они начнут бесконтрольно сканировать коды. И так. Есть ли какой-нибудь способ заблокировать ввод данных на время обработки некоторых данных? Код выглядит примерно так:

 def do_smth(input_data):
     #этот код выполняется в течение примерно 3-5 секунд, пока человек не пройдет через турникет
def main():
     while True:
         input_data = input()
         do_smth(input_data)


Пояснение: пока текст обрабатывается в do_smth(), я бы не хотел, чтобы вы вводили его повторно

Код выполняется через окно консоли. Заранее спасибо за ответ
Весь код запущен в Raspberry Pi под управлением Linux.

Я пробовал блокировать поток ввода, но не помогало.

Отредактировано Wor7hless (Авг. 28, 2024 11:06:41)

Офлайн

#2 Авг. 28, 2024 12:31:20

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1352
Репутация: +  118  -
Профиль   Отправить e-mail  

Как предотвратить ввод данных в пайтон во время выполнения функции

турникет один на вход и один на выход? Или один турникет на вход и на выход?

  
class QRScannerStateMachine:
    def __init__(self):
        self.state = 'waiting_for_activation'
        print(f"Состояние: {self.state}")
    def activate(self):
        if self.state == 'waiting_for_activation':
            self.state = 'ready_to_scan'
            print(f"Состояние: {self.state} - Сканер активен и готов к сканированию.")
        else:
            print("Сканер уже активен или находится в другом состоянии.")
    def scan_qr_code(self, qr_code):
        if self.state == 'ready_to_scan':
            print(f"QR-код обнаружен: {qr_code}")
            self.state = 'scanning'
            self.process_qr_code(qr_code)
        else:
            print("Сканер не готов к сканированию.")
    def process_qr_code(self, qr_code):
        if self.state == 'scanning':
            print(f"Сканирование QR-кода: {qr_code}")
            # Здесь идет обработка QR-кода, например, передача в базу данных
            if self.validate_qr(qr_code):
                self.state = 'processing_data'
                self.complete_scanning()
            else:
                self.state = 'error'
                self.handle_error("QR-код не распознан.")
        else:
            print("Неверное состояние для обработки QR-кода.")
    def validate_qr(self, qr_code):
        # Простая проверка кода: если код "1", значит он верен
            return qr_code == "1"
    def complete_scanning(self):
        if self.state == 'processing_data':
            print("QR-код успешно обработан. Возврат в готовность.")
            self.state = 'ready_to_scan'
        else:
            print("Неверное состояние для завершения сканирования.")
    def handle_error(self, message):
        print(f"Ошибка: {message}")
        # Сбрасываем в исходное состояние готовности
        self.state = 'ready_to_scan'
        print(f"Состояние: {self.state} - Сканер готов к следующему сканированию.")
    def deactivate(self):
        if self.state != 'waiting_for_activation':
            self.state = 'waiting_for_activation'
            print("Сканер отключен.")
        else:
            print("Сканер уже отключен.")
# Пример использования:
scanner = QRScannerStateMachine()
scanner.activate()  # Активируем сканер
while True:
    qr = input("> ")
    scanner.scan_qr_code(qr)

Отредактировано xam1816 (Авг. 28, 2024 15:01:18)

Онлайн

#3 Авг. 28, 2024 17:13:56

Wor7hless
Зарегистрирован: 2024-08-28
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Как предотвратить ввод данных в пайтон во время выполнения функции

xam1816
турникет один на вход и один на выход? Или один турникет на вход и на выход?
Один на вход и один на выход

Офлайн

#4 Авг. 28, 2024 21:07:06

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2750
Репутация: +  184  -
Профиль   Отправить e-mail  

Как предотвратить ввод данных в пайтон во время выполнения функции

> Есть ли какой-нибудь способ заблокировать ввод данных на время обработки некоторых данных?

Не нужно ничего блокировать! Создай на каждый пункт пропуска свой поток/процесс. За счёт этого они смогут работать не зависимо.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Онлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version