Я полагаю, что вид логики c, который вы ищете, выглядит примерно так:
1) запустить поток для запроса api
2), пока запрос не завершен, выполните другие действия. задача (показать фрейм без данных API)
3) прервать, когда закончите, (показать фрейм с данными API)
Я считаю, что ключом для вашего ответа является использование thread.is_alive, которое проверяет, поток активен и возвращает логическое значение в зависимости от состояния потока. Метод is_alive () часто используется в синхронизации потоков.
Я бы сделал то, что вы ищете, выполнив что-то похожее на этот фиктивный код:
import sys
import trace
import threading
import time
def show_frame(subject=""):
if subject:
print(f"showing frame with {subject}")
else:
print(f"showing frame")
def request_api():
time.sleep(5)
return "data from api"
def show_frame_from_api():
subject_dataAPI=request_api()
show_frame(subject=subject_dataAPI)
t = threading.Thread(target=show_frame_from_api, args=())
t.start()
while t.is_alive():
show_frame()
Применяя его в вашем примере, Я бы предложил что-то вроде этого:
import sys
import trace
import threading
import time
def show_frame(win_name, frame, apiText=""):
if apiText:
text=f'display with {apiText}'
cv2.putText(frame, text, (5, 30), cv2.FONT_HERSHEY_COMPLEX_SMALL, 1, (0, 0, 255), 1)
cv2.imshow(win_name, frame)
else
text=f'display without api text :('
cv2.putText(frame, text, (5, 30), cv2.FONT_HERSHEY_COMPLEX_SMALL, 1, (0, 0, 255), 1)
cv2.imshow(win_name, frame)
def show_frame_from_api(win_name, frame):
subject_dataAPI=request_api()
show_frame(win_name, frame, apiText=subject_dataAPI)
def request_api():
conn = http.client.HTTPSConnection('api.tive.com')
conn.request("POST", "/get_status", json_data, headers)
response = conn.getresponse()
rdata = response.read()
rdata = rdata.decode('utf8')
rdata = json.loads(rdata)
subject = rdata['subject']
txt = "SUBJECT: {}".format(subject)
return txt
if config['ROIX1'] < f_startX and config['ROIX2']:
# Call the API and get the response
"""
OTHER CODE
"""
t = threading.Thread(target=show_frame_from_api, args=(win_name, frame))
t.start()
while t.is_alive():
show_frame(win_name, frame)
key = cv2.waitKey(1)
if key == ord('q'):
break