簡體   English   中英

在while循環中使用線程的運行時錯誤

[英]Run Time error on using Threading in a while loop

我正在使用 python 中的 MediaPipe 和 OpenCV 開發基於視覺的美國手語轉換器應用程序。 您可能知道,在網絡攝像頭中,我們使用 while 循環來連續檢測我們的手部。 現在的問題是,當我使用 pyttx3 為檢測到的手勢添加音頻 function 時,網絡攝像頭總是在執行 pyttsx3 引擎 function 期間被擊中。 為了解決這個問題,我使用線程並為該音頻相關部分創建了一個線程,並將該線程放入該網絡攝像頭的 while 循環中。 但現在的問題是,“運行時錯誤:循環已啟動”在終端中不斷出現。

我為我的問題制作了 model 代碼。 我知道問題是線程 function 一次又一次地調用說話 function,在說話 function 里面,我已經使用了這個方法,這是循環運行。 請調查此事。 兩周來我一直在尋找解決方案。 我已經自己嘗試了所有可能的事情。

import pyttsx3
from threading import Thread
import random


engine = pyttsx3.init()
def speak(text):
    engine.say(text)
    engine.runAndWait()

while True:
    l = ['A', 'B', 'C', 'D', 'E']
    a = random.choice(l)
    print(a)
    
    t = Thread(target=speak, args=(a,))
    t.start()
    #engine.stop()

正如您所提到的,問題在於您使用了一遍又一遍地調用 function 的線程。 這是有問題的。 首先,您每秒創建 100 個 Threading 實例,這是非常低效的。 其次,您正在創建積壓的 1000 次呼叫“引擎”,這將需要數小時才能完成。 盡管如此,還是可以更改您的代碼並使其按照您想要的方式運行:

import pyttsx3
from threading import Thread
import random
from queue import Queue


def speak(q):
    engine = pyttsx3.init()
    
    while True:
        
        if q.empty() is False:
            a = q.get()
            engine.say(a)
            engine.runAndWait()
        else:
            pass

queue= Queue()
t = Thread(target=speak, args=(queue,))
t.start()

while True:
    l = ['A', 'B', 'C', 'D', 'E']
    a = random.choice(l)
    queue.put(a)
    print(a)

本質上,您正在創建一個與pyttsx3通信的新線程(只有一個)。 每次迭代,您都會將想要閱讀的任何內容放入隊列中,系統將一個接一個(以先到先得的方式)並閱讀它們。 這只需要一個額外的線程,因此您不需要創建 100 個 Thread 實例。

但是,這種方法仍然會積壓 1000 多個要發表的演講。 我沒有 ASL 分析的經驗。 但是我解決這個問題的方法是使用單獨的線程來分析視頻的最后 2~5 秒,如果檢測到手勢,它將初始化說話命令。 這將使演講落后於視頻幾秒鍾,在這種情況下完全沒問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM