Только первый поток выполняется с использованием потоков Python - PullRequest
0 голосов
/ 03 сентября 2018

Привет, ребята, я не знаю, почему работает только один блок - моя первая функция.

Я пытаюсь передать последнее значение моего coin_counter во 2-ю функцию, но моя первая функция не передает значение после его освобождения.

и не выводится на консоль

import RPi.GPIO as GPIO
import time
import threading

GPIO.setmode(GPIO.BCM)

GPIO.setup(27,GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

lock = threading.Lock()

counter = 1
pulse = 0

def coin_counter():
    global counter

    lock.acquire()
    try:
        while True:
            time.sleep(.1)
            GPIO.wait_for_edge(27, GPIO.RISING)
            #print("Pulse comming ! (%s)") %counter
            counter += 1
        return counter
    finally:
        lock.release()

print(coin_counter())

def get_pulse_count():
    while True:
        print('Hello World!')


try:
    coincounter = threading.Thread(target=coin_counter)
    getpulse = threading.Thread(target=get_pulse_count)
    coincounter.start()
    getpulse.start()
except KeyboardInterrupt:
    coincounter.stop()
    getpulse.stop()
    GPIO.cleanup()

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

Я думаю, что это решит проблему. или

    import RPi.GPIO as GPIO
    import time
    import threading

    GPIO.setmode(GPIO.BCM)

    GPIO.setup(27,GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

    lock = threading.Lock()

    counter = 1
    pulse = 0

    def coin_counter():
        global counter
        global pulse
        lock.acquire()
        try:
            time.sleep(.1)
            GPIO.wait_for_edge(27, GPIO.RISING)
            print("Pulse comming ! ", counter)
            counter += 1
            pulse = counter
        finally:
            lock.release()

    def get_pulse_count():
        global pulse
        lock.acquire()
        try:
            print(pulse)
        finally:
            lock.release()

    while True:
        time.sleep(.1)
        try:
            coincounter = threading.Thread(target=coin_counter)
            coincounter.start()
            getpulse = threading.Thread(target=get_pulse_count)
            getpulse.start()
        except KeyboardInterrupt:
            coincounter.stop()
            getpulse.stop()
            GPIO.cleanup()
0 голосов
/ 03 сентября 2018

Я думаю, что проблема в строке print(coin_counter()). Его следует удалить, потому что у нас есть бесконечный цикл в главном потоке (вызов coin_counter()). Никакой код не будет выполняться после этой строки. Если мы удалим эту строку и добавим sleep в get_pulse_count(), то это сработает. Также return counter не требуется, если вы передаете значение через глобальную переменную counter.

...