непрерывный запуск цикла python во время чтения из базы данных - PullRequest
0 голосов
/ 25 февраля 2019

Я делаю табло с 7-сегментным дисплеем (4 дисплея) с помощью raspberry pi 3. Я создал программу на python, которая считывает 2 числа из базы данных и сохраняет их в переменной, проверяет, сколько там цифр (поскольку я могуотправьте только одну цифру на один дисплей), а затем она отправит правильную информацию на контакты GPIO.Каждая цифра включена в течение 0,001 с, и, таким образом, в 0,004 с проходит все 4. Затем она повторяет в общей сложности 200 повторений, прежде чем вернуться назад и проверить, были ли внесены какие-либо изменения в базу данных.

Однако, пока он перечитывает данные из базы данных, есть небольшой момент, когда все дисплеи выключены.Мне интересно, возможно ли продолжить цикл (тот, который содержит 200 повторов) с ранее сохраненной переменной и перезапустить его с новыми только после того, как база данных закончит читать новую информацию.

#i have set up the database and all other important stuff outside this loop
while 1:
    digitTipe = 0   
    digitTipe2 = 0
    timer = 0  #counter for the GPIO loop

    #it gets the info from db and then it lists the digits
    cur.execute("SELECT gol_domaci FROM tekme ORDER BY id DESC LIMIT 0, 1") 
    db.commit()
    home_team = cur.fetchall()
    for q in home_team-:
        digits= list(int(d) for d in str(q[0]))



    #same but for the other team
    cur.execute("SELECT gol_gosti FROM tekme ORDER BY id DESC LIMIT 0, 1")
    db.commit()
    guest_team = cur.fetchall()
    for e in guest_team:
        digit2 = list(int(d) for d in str(e[0]))



    #here checks if both digits are the same (11, 22, 33...), is just one digit(3, 6, ...) or if is just a random number (12, 23, 45,...)
    #based on these results the GPIO output knows how to properly send out voltage... i tried with other methods but this one works for me
    if len(digit) < 2:
        digitTipe = 1
    else:
        if digit[0] == digit[1]:
            digitTipe = 2
    if len(digit2) < 2:
        digitTipe2 = 1
    else:
        if digit2[0] == digit2[1]:
            digitTipe2 == 2



    while timer < 200:  #this is the loop that has code for GPIO pins
    #("insert digit output code")

"Отставание "не так уж плохо, максимум на 0,1 с, но это заметно и раздражает, поэтому мои" коллеги "хотят, чтобы это было исправлено.Но если это возможно, я не хочу создавать два отдельных файла кода

Извините за плохое качество кодирования.это моя первая "настоящая" программа на питоне и вообще.Мне также жаль, если я недостаточно конкретен, поскольку это также мой первый вопрос по stackoverflow.заранее спасибо!

1 Ответ

0 голосов
/ 25 февраля 2019

Из того, что я понял, цикл while timer < 200: … активирует дисплей.Поэтому, когда этот цикл не выполняется из-за cur.execute(…) и т. Д., Дисплей деактивируется.

Решение заключается в использовании асинхронного программирования.Вот хороший вопрос по теме: Асинхронное программирование на Python

Это пример, скопированный и вставленный из одного из ответов (автор Джесси Диллон):

from threading import Thread

def background_stuff():
  while True:
    print "I am doing some stuff"

t = Thread(target=background_stuff)
t.start()

# Continue doing some other stuff now

Вы можете создать две функции, аналогичные background_stuff, одну для управления отображением, другую для извлечения информации из базы данных.Затем создайте два потока на основе этих двух функций и запустите оба.Итак:

# declare variables here
def handle_display():
    while True:
        # put here what is under the `while timer < 200: … ` loop

def fetch_from_db():
    # every time timer runs out, fetch info from database
    # and store in variables declared at line 1

t1 = Thread(target=handle_display)
t2 = Thread(target=fetch_from_db)
t1.start()
t2.start()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...