Как реализовать многопоточность в Kivy? - PullRequest
0 голосов
/ 14 апреля 2019

Я пытаюсь использовать основанные на numpy функции, которые подтверждают Kivy, но как только эти функции называются on_enter a Kivy Screen, приложение зависает и потребляет так много ресурсов ЦП и ОЗУ. Я подозреваю, что это потому, что они не могут сосуществовать в одном потоке, поэтому я попробовал многопоточность, но приложение по-прежнему падает. Я застрял в этом несколько дней.

Это мои простые функции в сочетании с модулем Thread.

c=threading.Condition()
class Compare_Thread(threading.Thread):
    def __init__(self,name):
        threading.Thread.__init__(self)
        self.name=name
    def run(self):
        engine = pyttsx.init()
        count=1
        while (count>0):
            c.acquire()
            livecsv=np.genfromtxt("lettera.csv", delimiter=",", skip_header=1, filling_values=np.nan, dtype=int, case_sensitive=True, deletechars='', replace_space=' ')
            refcsv=np.genfromtxt("refcsv1.csv", delimiter=",", skip_header=1, filling_values=np.nan, dtype=int, case_sensitive=True, deletechars='', replace_space=' ')
            A=np.array(livecsv)
            B=np.array(refcsv)
            D=B - A[-1]
            match= B[np.abs(D).sum(axis=1).argmin()]
            global where
            where=match[0]
            time.sleep(1)
            count = count + 1
            c.notify_all()

class Verify_Thread(threading.Thread):
    def __init__(self,name):
        threading.Thread.__init__(self)
        self.name=name
    def run(self):
        global where
        engine = pyttsx.init()           
        num2words = {1: 'A', 2: 'B', 3: 'C', 4: 'D', 5: 'E', \
         6: 'F', 7: 'G', 8: 'H', 9: 'I', 10: 'J', \
        11: 'K', 12: 'L', 13: 'M', 14: 'N', \
        15: 'O', 16: 'P', 17: 'Q', 18: 'R', \
        19: 'S', 20: 'T', 21: 'U', 22: 'V', 23: 'W', 24: 'X', 25: 'Y', 26: 'Z', \
        31: 'Hello', 32: 'Goodbye', 33: 'Good Morning', 34: 'Good Night', 35: 'Good Afternoon', \
        90: 'Ninety', 0: 'Zero'}
        text2speech=num2words[where]
        engine.say(text2speech)
        engine.runAndWait()

и это экран, на котором я пытался вызвать эти функции, но вылетает все приложение.

class LetterAScreen(Screen):
    def on_enter(self):
        self.loader()
    def loader(self):
        lol= Identifier()
        self.identity()
        self.verifier()
    def identity(self):
        global where
        t1=Compare_Thread("thread1")
        t1.daemon=True
        t1.start()
        t1.join() 
    def verifier(self):
        global where
        count = 1
        while (count>0 and where!=1):
            self.identity()
            count=count+1
        t2=Compare_Thread("thread2")
        t2.start()
        t2.join()

Я не знаю, является ли мой код неправильным, или это ошибка в Kivy, или мне нужно реализовать многопоточность. Пожалуйста, помогите мне.

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